1、shell基本语法
shell脚本第一行必须以 #!/bin/sh 开头。
1.1、shell程序的变量和参数
对shell来讲,所有变量的取值都是一个字符串,shell程序采用$var的形式来引用名为var的变量的值。
1.1.1、shell定义的环境变量
shell在开始执行的时候就已经定义了一些和系统的工作环境相关的变量,这些变量用户还可以重新定义。
HOME | 用户保存注册目录的完全路径名。 |
PATH | 用于保存用冒号分隔的目录路径名,shell将按PATH变量中给出的顺序搜索这些目录,找到的第一个与命令名称一致的可执行文档将被执行。 |
TERM | 终端的类型。 |
UID | 当前用户的识别字。 |
PWD | 当前工作目录的绝对路径,该变量的取值随cd命令的使用而变化。 |
PS1 | 主提示符,在root用户下,默认的是#,在普通用户下,默认是$。 |
PS2 | 在shell接收用户输入的命令过程中,如果用户在输入行末尾输入“/”然后回车,或者当用户按回车键时shell判断用户输入的命令没有结束时,显示这个辅助提示符,提示用户继续输入命令的其余部分,默认的辅助提示符是“>”。 |
1.1.2、用户定义变量
变量名=变量值
1、在定义变量时,变量名前不应加$,在引用变量的内容时,则应该在变量名前加$。
2、在给变量赋值时,等号两边一定不能有空格,若变量本身就包含了空格,则整个字符串都要用双引号括起来。
定义常量 readly 变量名
定义公用变量 export 变量名
export命令可以将一个局部变量提供给shell执行的其它命令使用,在shell以后运行的所有命令或程序中都可以访问到。
1.1.3、位置参数
在调用shell程序的命令行中按照各自的位置决定的变量。
$1、$2,依次类推
$0是一个特殊变量,它是当前这个shell程序的文件名,所以$0不是一个位置参数。在显示当前所有位置参数时,不包括$0
1.1.4、预定义变量
预定义变量和环境变量类似,也是在shell一开始时就定义了变量。不同的是,用户者能使用预定义变量,而不能重定义它。所有预定义变量都是由$符号和另一个符号组成的。
$# | 位置参数的变量 |
$* | 所有位置参数的内容 |
$? | 命令执行后返回的状态(用于检查上一个命令是否执行正确,linux中,命令退出状态0表示正确,任何非0表示命令出错) |
$$ | 当前进程的进程号(最常见的用途是用作暂存文件的名字以保证暂存文件不会重名) |
$! | 后台运行的最后一个进程号 |
$0 | 当前执行的进程名 |
1.1.5、参数置换变量
变量=${参数-word} | 如果设置了参数,则参数的值替换变量值,否则,用word置换 |
变量=${参数=word} | 变量置换成word后,参数也替换成word。位置参数不能使用这种方式 |
变量=${参数?word} | 如果设置了参数,则用参数的值替换变量的值,否则显示word并从shell中退出,如果省略了word,则显示标准资讯(长用于出错提示) |
变量=${参数+word} | 如果设置了参数,则用word置换,否则不置换 |
1.2、流程控制
1.2.1、测试命令
1.2.1.1、数值测试
-eq | 等于为真 |
-ne | 不等于为真 |
-gt | 大于为真 |
-ge | 大于等于为真 |
-lt | 小于为真 |
-le | 小于等于为真 |
1.2.1.2、字符串测试
= | 等于为真 |
!= | 不等于为真 |
-z 字符串 | 字符串长度伪则为真 |
-n 字符串 | 字符串长度不伪则为真 |
1.2.1.3、文件测试
-e 文件名 | 如果文件存在为真 |
-r 文件名 | 如果文件存在并且可读为真 |
-w 文件名 | 如果文件存在并且可写为真 |
-x 文件名 | 如果文件存在并且可执行为真 |
-s 文件名 | 如果文件存在并且至少有一个字符则为真 |
-d 文件名 | 如果文件存在且为目录则为真 |
-f 文件名 | 如果文件存在且为普通文件则为真 |
-c 文件名 | 如果文件存在且为字符型特殊文件则为真 |
-b 文件名 | 如果文件存在且为块特殊文件则为真 |
1.2.1.4、与或非
! | 非 |
-o | 或 |
-a | 与 |
! 最高 -a 其次 -o 最低
1.2.1.5、算数运算
var1=2
var2=$[var1*10+1]
var2的值为21
1.2.2、if条件语句
if 条件1; then
命令1
elif 条件2; then
命令2
else
命令3
fi
1.2.3、for循环
for 变量名 [in 数值列表] do 若干命令行 done | for 变量名 in 文件正则表达式 do 若干命令行 done | for i in $* do 若干命令行 done |
1.2.4、while循环
while 判断真假
do
若干命令行
done
为真时继续执行
1.2.5、until循环
until 判断真假
do
若干命令行
done
为假时继续执行
1.2.6、case条件选择
case 变量 in
字符串1)
命令列表1
;;
字符串2)
命令列表2
;;
字符串n)
命令列表n
;;
*)
其它命令行
esac
1.2.7、无条件控制语句
break
continue
1.2.8、函数定义
1.2.8.1、定义
funcitonName {
若干命令行
}
1.2.8.2、调用
funcitonName param1 param2 ……
在函数定义时不用带参数,但在调用函数时可以带有参数,此时shell将把这些参数分别赋予相应的位置参数
1.2.9、命令分组
分组方法“()”和“{}”
当shell执行()中的命令时将再创建一个新的子进程,这个子进程进去执行()中的命令。如果用户在执行命令时不想让命令运行时对状态集合,如环境变量、当前工作目录等的改变影响到下面语句的执行时,就应该把这些命令放到()中,这样就可以保证所有改变只会对子进程产生影响,不会对父进程产生任何干扰。
{}用于将顺序执行的命令的输出结果用于另一个命令的输入。
注:当我们真正需要使用“()”和“{}”时,则需要在其前面加上转义符号/,以便让shell知道它们不是用于命令执行的控制所用。
1.2.10、信号
trap命令???
1.3、shell程序的执行方法
sh shell程序文件名
用chmod命令使shell文件具有可执行权限
1.4、bash程序的调试
bash -参数 shell程序文件名
常用参数
-e | 如果一个命令失败就立即退出(shell默认情况下,若遇到不存在或不可执行的命令、重定向失败或命令非正常结束,如果未重定向,则错误信息会显示在屏幕上,而shell程序仍将继续执行) |
-n | 读入命令但是不执行它们 |
-u | 使用未赋值变量时退出程序并显示错误信息(shell默认设置允许使用未赋值的变量) |
-v | shell在执行程序过程中,把它读入的每一个命令行都显示出来 |
-x | shell在执行程序过程中,把它执行的每一个命令在行首用一个+加上命令名显示出来,并且把每一个变量和该变量的值也显示出来 |
上面的选项也可以在shell程序内部用“set -常用参数”的形式引用,而“set +常用参数”则将禁止该选择项起作用。
1.5、bash的内部命令
echo -n(不换行) arg | 在屏幕上打印出arg指定的字符串 |
eval args | 当shell程序执行到eval语句时,shell读入参数args,并将它们组合成一个新的命令,然后执行 |
exec 命令 命令参数 | 当shell程序执行到exec语句时,不会去创建新的子程序,而是转去指定命令,当指定命令执行完毕,该进程终止,exec后面的语句将不再执行 |
export 变量名 export 变量名=值 | shell可以用export把它的变量向下带入子shell程序而让子进程继承父进程中的环境变量,但shell不能用此命令把它的变量带入父shell 注:不带任何变量的export则将显示出当前所有的export变量 |
readonly 变量名 | 定义常量,不带变量的readonly则显示出所有常量 |
read -p(提示语句) -n(字符个数) -t(等待时间) -s(不回显) 变量名表 | 从标准输入设备读入一行,分解成若干字,赋值给shell程序内部定义的变量。 |
shift shift 跳转数字 | 使用此命令将位置参数向左移动一个位置,并使位置参数$#减一,直到减到0 |
wait | shell等待后台启动的所有子进程结束,wait的返回值总是真 |
exit | 退出shell程序,在exit后可选择一个数作为返回状态。如 exit 0 |
. shell程序文件名 | 使shell读入指定的shell程序文件,并依次执行文件中的所有语句 |