Shell Script 学习
简单学习过 Shell 后,接下来继续学习 Shell 脚本。
良好风格
- 在脚本的第一行,要宣告该脚本使用的 shell 名称,比如
#!/bin/bash
。 - 说明部分,要说明脚本的功能、版本、作者、联系方式、版权声明等。
- 脚本运行时需要用到的环境变量要预先定义和配置。
- 脚本正文中,比较特殊的命令使用绝对路径的方式下达。
- 定义回传值,比如成功为 0,失败为非零整数。
注释
单行注释很简单,使用 #
开头就代表本行注释。
1 | # 我是注释 |
多行注释
使用 :<<
开头,后边可以跟其他的字符,最后再以对应的字符结尾。
1 | :<<EOF |
条件判断
一般在编程语言中,我们通常都能够使用 if else 语句进行条件判断,bash 也不例外。但是除了条件判断语句,bash 还有一些条件判断的命令。
test 命令
test 命令可以检测系统中的文件以及相关的属性。常用的参数如下:
标志 | 含义 |
---|---|
-e | 文件是否存在 |
-f | 判断是否存在且为文件 |
-d | 判断是否存在且为目录 |
-L | 判断文件是否存在且是链接文件(软链接或硬链接) |
-r | 判断文件是否存在且有读的权限 |
-w | 判断文件是否存在且有写的权限 |
-x | 判断文件是否存在且有执行的权限 |
-nt | test file1 -nt file2 ,判断 file1 是否比 file2 新(newer than) |
-ot | 判断 file1 是否比 file2 旧(older than) |
-ef | 判断两个文件是否为同一个文件,主要用于判断硬链接。 |
-eq | 判断两个整数是否相等(equals) |
-ne | 判断两个整数是否不相等(not equals) |
-gt | test num1 -gt num2 ,判断 num1 是否大于 num2(greater than) |
-lt | 判断 num1 是否小于 num2(less than) |
-ge | 判断 num1 是否大于等于 num2(greater than or equals) |
-le | 判断 num1 是否小于等于 num2(less than or equals) |
-z | 判断字符串是否为空 |
-n | 判断字符串是否不为空 |
= | test str1 = str2 ,判断 str1 是否等于 str2 |
!= | test str1 != str2 ,判断 str1 是否不等于 str2 |
-a | 相当于 and,只有都成立时才会返回 true,比如 test -r file1 -a -x file2 |
-o | 相当于 or,任何一个成立时就会返回 true |
! | 取反,比如 test ! -x file1 ,当 file1 不具有执行的权限时返回 true |
需要注意的是,test 命令返回的值并不会直接输出到屏幕,因此需要自己控制输出,比如:
1 | $ test -r file1 && echo true || echo false |
判断符号
除了 test 命令,我们还可以使用判断符号 []
,也就是中括号来进行数据的判断。需要注意的是,因为中括号用在很多地方,所以在 bash 中使用中括号作为判断符号时,中括号的两端需要有空白字节来分隔,并且在中括号中的变量一定要用双引号包含,同时常量也要使用单引号或者是双引号包含。
1 | $ [ -z "$HOME" ]; echo $? |
在 bash 中使用一个等号与两个等号的意义相同,不过在程序中一般写法是,一个等号代表赋值,两个等号则代表条件判断。建议在条件判断时,使用双等号。
条件语句
1 | read -p "Please input (Y/N): " yn |
1 | case $1 in |
函数
1 | function printit() { |
循环
1 | while [ "$yn" != "Y" ] && [ "$yn" != "y" ] |
1 | until [ "$yn" == "Y" ] || [ "$yn" == "y" ] |
while 循环与 until 循环的区别是,while 循环在条件满足时才会执行循环体;而 until 循环是在条件不满足时才会执行循环体。
1 | for animal in dog cat mouse rabbit |
1 | read -p "Please input a number, I will count for 1+2+...+your_input: " num |
语法检查
使用 sh -n xxx.sh
来检查脚本是否存在语法错误,如果没有则不会显示任何信息。同时,可以使用 sh -x xxx.sh
将脚本的执行过程全部列出,这样能够方便发现和调试错误。
运行 Shell 脚本
在运行脚本之前,需要先确认脚本是否具有执行的权限。如果没有,则需要赋予执行的权限。
1 | # 以下命令需要 cd 到脚本所在目录执行 |
一定要写成 ./xxx.sh
,运行其它二进制的程序也一样。如果直接写 xxx.sh
,系统会去 PATH 里寻找,而一般 PATH 里只有 /bin
,/sbin
,/usr/bin
,/usr/sbin
等,当前目录通常不在 PATH 里,所以写成 xxx.sh
是找不到命令的,要用 ./xxx.sh
告诉系统就在当前目录找。
还有一种运行脚本的方法是直接运行解释器,传入需要运行的脚本文件名:/bin/sh xxx.sh
。以及使用 source 命令运行脚本,比如 source ./xxx.sh
,这种方式与前两种的区别是,使用该命令,脚本会在父程序中执行;而前两种会在子程序中运行。这也是为什么使用 source 可以使配置立即生效的原因。
参考
《鸟哥的Linux私房菜》