使用结构化命令
原因:许多程序在脚本命令之间需要某种逻辑流控制。
使用if-then语句
最基本的结构化命令类型为if-then语句,格式为:
1 | if command |
这里有一些困惑,如果if后面的命令运行成功(即返回的是0值),就会执行then后面的command的,相反,就会跳过。
比如,你可以搜索你的名字是否在passwd中
1 | if grep leo /etc/passwd |
if-then-else语句
上面的if-then只有一个选择,而这个可以有多个选择。
格式为:
1 | if command |
嵌套if语句
使用else部分的另一种版本,成为elif
1 | if command |
test命令
test命令提供了一种检测if-then语句中不同条件的方法。
1 | if test condition |
test命令能够评估以下3类条件:
- 数值比较
- 字符串比较
- 文件比较
数值比较
test命令最常用于比较两个数值。
- test int1 -eq int2 判断是否相等
- test int1 -ne int2 判断是否不等
- test int1 -lt int2 判断是否小于
- test int1 -le int2 判断是否不小于
- test int1 -gt int2 判断是否大于
- test int1 -ge int2 判断是否不大于
字符串比较
test也允许对字符串进行比较,执行字符串比较可能有点复杂。
- test –n 字符串 字符串的长度非零
- test –z 字符串 字符串的长度为零
- test 字符串1=字符串2 字符串相等
- test 字符串1!=字符串2 字符串不等
- test 字符串1>字符串2 字符串1大于字符串2
- test 字符串1<字符串2字符串1小于字符串2
字符串比较:
- 大于和小于符号一定要转义,否则shell会将他们当做重定向符号,将字符串值看做文件名;
- 大于和小于顺序与在sort命令中的顺序不同
文件比较
Shell脚本中最强大和最常用的一类比较。test命令能够测试linux文件系统上的文件状态和路径。
文件比较:-
- -d file 检查file是否存在并且是一个目录
- -e file 检查file是否存在
- -f file 检查file是否存在并且是一个文件
- -r file 检查file是否存在并且可读
- -s file 检查file是否存在并且不为空
- -w file 检查file是否存在并且可写
- -x file 检查file是否存在并且可执行
- -0 file 检查file是否存在并且被当前用户拥有
- -G file 检查file是否存在并且默认组是否为当前用户组
- file1 -nt file2 检查file1是否比file2新
- file1 -ot file2 检查file1是否比file2旧
复合条件检查
if-then语句可以使用布尔逻辑来合并检查条件,可以使用两个布尔操作符:
- [condition1] && [condition2]
- [condition1] || [condition2]
if-then的高级特征
Bash shell中最近增加了两个比较新的功能,它们提供了可以在if-then语句中使用的高级功能:
- 双圆括号表示数学表达式
- 双方括号表示高级字符串处理函数
使用双圆括号
双圆括号命令允许在比较中包含高级数学公式。双圆括号命令提供更多的数学符号,这些符号是其他语言程序员习惯使用的符号。格式为:
((expression))
双圆括号命令符号
- val++ 后增量
- val– 前减量
- ++val 前增量
- –val 后减量
- ! 逻辑否定
- ~ 逐位取反
- ** 取幂
- << 逐位左移
逐位右移
- & 逐位布尔逻辑与
- | 逐位布尔逻辑或
- && 逻辑与
- || 逻辑或
使用双方括号
双方括号命令为字符串比较提供了高级功能,它提供了test命令没有的另一个功能,即模式匹配。例如
1 | if [[ $USER == r*]] |
case命令
替代if-then-elif,提供了一种为每个可能的变量值指定不同选项的更清楚的方法。
格式为:
1 | case variable in |