1.if-then语句
最基本的结构化命令就是if-then语句:
格式:
if cmd
then
cmds
fi
含义:
if 语句会运行 if 后面的那个命令,如果该命令的退出状态码为0,则 then 后面的命令就会被执行;
如果 if 后面的命令退出状态码为非0的值,则 then 后面的命令就不会被执行,bash shell会继续执行脚本中的下一个命令。
‘ fi ’表示if-then语句到此结束。
在 then 部分可以使用不止一条命令,可放置多条命令。
2.if-then-else 语句
格式:
if cmd
then
cmds
else
cmds
fi
含义:
if 语句会运行 if 后面的那个命令,如果该命令的退出状态码为0,则 then 后面的命令就会被执行;
当if语句中的命令返回非零的值时,bash shell 会执行else部分的命令。
3.嵌套if
好的嵌套采用elif的方式:
格式:
if cmd1
then
cmds
elif cmd2
then
cmds
else
cmds
fi
如果elif后的命令的退出状态码是0,则bash shell会执行第二个then语句后的语句。
4.test命令
test命令提供了再if-then语句中测试不同条件的途径。
如果test命令中列出的条件成了,test命令就会退出并返回退出状态码 0。
如果条件不成立,test命令就会退出并返回非0的退出状态码,这使得if-then语句不会再被执行。
格式:
if test condition
then
cmds
fi
Bash shell 还提供了另外一种测试方法:
格式:
if [ condition ]
then
cmds
fi
方括号定义了测试条件,注意,第一个方括号之后和第二个方括号之前必须加上一个空格,否则就会报错。
test命令可以判断三类条件:
- 数值比较;
- 字符串比较;
- 文件比较;
4.1 数值比较
比较数值时,test只能测试整数,不能对浮点数进行测试。
4.2 字符串比较
=;!=;<;>;
-n str1:检查str1的长度是否非0;
-z str1:检查str1的长度是否为0;
注:
大于号和小于号必须要转义,否则shell会把它们当做重定向符号,把字符串值当作文件名;
大于和小于顺序和sort命令所采用的不同。
4.3 文件比较
文件比价是shell编程中最为强大,也是用得最多的比较形式。
test命令的文件比较功能:
比较 | 描述 | |
1 | -d file | 检查file是否存在,并且是一个目录 |
2 | -e file | 检查file是否存在 |
3 | -f file | 检查file是否存在,并且是一个文件 |
4 | -r file | 检查file是否存在,并且可读 |
5 | -s file | 检查file是否存在,并且非空 |
6 | -w file | 检查file是否存在,并且可写 |
7 | -x file | 检查file是否存在,并且可执行 |
8 | -O file | 检查file是否存在,并且属于当前用户所有 |
9 | -G file | 检查file是否存在,并且默认组与当前用户相同 |
10 | File1 -nt file2 | 检查file1是否比file2新 |
11 | File1 -ot file2 | 检查file1是否比file2旧 |
5.if-then的高级特性
- 用于数学表达式的双括号;
- 用于高级字符串处理功能的双方括号;
5.1 使用双括号
双括号命令允许在比较过程中使用高级数学表达式。
格式:(( expression ))
可以在if语句中使用双括号命令,也可以在脚本中的普通命令里使用来赋值。
5.2 使用双方括号
双方括号命令提供了针对字符串比较的高级特性。
格式:[[ expression ]]
6.case 命令
case命令会采用列表格式来检查单个变量的多个值。
格式:
case variable in
pattern1 | pattern2) commands1;;
pattern3) commands2;;
*) default commands3;;
esac
case命令会将指定的变量与不同模式进行比较。如果变量和模式是匹配的,那么shell会执行该模式指定的命令。
可以通过竖线操作符在一行中分隔出多个模式模式。
星号会捕获所有与已知模式不匹配的值。
case命令提过了一个更清晰的方法来为变量每个可能的值指定不同的选项。