Shell编程和JavaScript非常相似,Shell和JavaScript都是弱类型语言,同时也都是解释型语言。解释型语言需要解释器,JavaScript的解释器是浏览器,Shell脚本的解释器时bash,是一个shell、一个命令行用户接口。
1.2 bash简述bash在执行或者解释脚本的时候,此bash非彼bash。用户登录进来的时候就用一个bash。通过敲一个命令来解释脚本的时候,是在当前bash中打开一个新的bash,这两个bash是父子关系。其实在空行敲回车也是从当前bash打开新的bash。
在命令行中输入$ps -aux |grep bash可以看见当前只有一个bash。这个bash就是系统和用户进行交互的一个用户接口。
在命令行中输入命令bash回车。这就是打开了一个新的bash。再次输入ps -aux |grep bash可以看见当前有两个bash。因为敲一个命令就是一个程序的入口,这个命令就被启动,这个程序就是bash。这两个bash就是父子关系。这种有层次结构的bash可以使用exit退出。
(二)变量 2.1 变量的类型shell脚本的变量实际上也是bash的变量,共有四种类型:环境变量、本地变量(或称局部变量,但略有差别)、位置变量、特殊变量。环境变量,作用在当前bash和所有子bash,与本地变量的区别在于作用域不同;本地变量(局部变量,当前代码段),作用在当前bash,所有子bash都不能用;位置变量和特殊变量,是bash内置的用来保存某些特殊数据的变量,也不存在作用域的问题(也叫系统变量)。
2.2 环境变量环境变量,$export 变量名=值,其作用域为当前的shell和其子shell。
注意:脚本在执行时都会启动一个子shell进程,命令行中启动的脚本会继承当前shell环境变量;系统自动启动脚本(非命令行启动),则需要自我定义环境变量。
2.3 本地变量(局部变量)本地变量是只属于某一个bash的变量。例如,$var_name=值,其作用域是整个bash进程。
局部变量类似,例如$local var_name =值,其作用域为当前代码段。
2.4 位置变量位置变量是指用于脚本执行的参数,$1表示第一个参数,以此类推$1,$2…。
2.5 特殊变量特殊变量是每一个bash进程中特有的一些变量,无需声明。总共就几个,$?和$#j较为常用。
2.5.1 $?$? 表示上一个命令的执行状态返回值。事实上,任何一个程序执行的结果只有两类,即程序有两类返回值:
第一类是命令的执行结果。例如输入$ls显示的目录下的所有目录和文件就是执行结果,再如输入$id -u root看见的0就是执行结果。
第二类是命令的执行状态。任何命令的执行状态都被$?这个变量存储起来。$?: 0表示正确,1-255表示错误。例如使用$echo “$?”查看上一个命令的执行状态,打印上一个命令的执行状态0表示正确,非0表示错误。注意不能查看上上个命令的执行状态,因为被覆盖了。
2.5.2 $#
$# 表示传递到脚本的参数个数。
2.5.3 $*$* 表示传递到脚本的参数,与位置变量不同,此选项参数可超过9个。
2.5.4 $$$$ 表示脚本运行时当前进程的ID号,常用作临时变量的后缀。
2.5.5 $!$! 表示后台运行的(&)最后一个进程的ID号 。
2.5.6 $@$@ 与$#相同,使用时加引号,并在引号中返回参数个数。
2.5.7 $-$- 表示上一个命令的最后一个参数 。
2.6 变量的声明、撤销、查看与引用 2.6.1 声明变量环境变量的声明必须加export;本地变量和局部变量的声明不需写export,直接写变量名后面接值即可。
2.6.2 撤销变量使用unset 变量名,撤销变量。
2.6.3 查看变量查看shell中变量:set
查看shell中的环境变量:printenv或env
2.6.4 引用变量a) 引用变量
引用变量格式为:${变量名},一般可以省略{}。只有特殊情况下不能省略,具体效果见下图: