基本语法
1、if-then语句
if command
then
commands
fi
2、if-then-else语句
if command
then
commands
else
commands
fi
3、嵌套if语句
if command
then
commands
elif command2
then
commands
fi
4、case语句
case variable in
pattern1 | pattern2) commands1;;
pattern3) commands2;;
*) default commands;;
esac
注:bash shell的if语句会运行if行定义的那个命令。如果该命令的退出状态码是0(该命令成功运行),位于then部分的命令就会被执行。如果该命令的退出状态码是其他什么值,那then部分的命令就不会被执行。
test命令
test命令提供了在if-then语句中测试不同条件的途径。如果test命令中列出的条件成立,test命令就会退出并返回退出状态码0,位于then部分的命令就会被执行。如果条件不成立,test命令就会退出并返回退出状态码1。
使用语法如下:
if test condition
then
commands
fi
或者
if [ condition ]
then
commands
fi
注:condition与左右方括号之间均有一个空格
test命令可以判断3类条件:
1、数值比较
比较 | 描述 |
---|---|
n1 -eq n2 | 检查n1是否与n2相等 |
n1 -ge n2 | 检查n1是否大于或等于n2 |
n1 -gt n2 | 检查n1是否大于n2 |
n1 -le n2 | 检查n1是否小于或等于n2 |
n1 -lt n2 | 检查n1是否小于n2 |
n1 -ne n2 | 检查n1是否不等于n2 |
2、字符串比较
比较 | 描述 |
---|---|
str1 = str2 | 检查str1是否与str2相同 |
str1 != str2 | 检查str1是否与str2不同 |
str1 < str2 | 检查str1是否比str2小 |
str1 > str2 | 检查str1是否比str2大 |
-n str1 | 检查str1长度是否非0 |
-z str1 | 检查str1长度是否为0 |
注1:大于和小于号必须用’\’进行转义
注2:大于小于顺序和sort命令采用的不同,test命令会使用标准的ASCII顺序
3、文件比较
比较 | 描述 |
---|---|
-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旧 |
注:对于-G file,假设用户同时属于group1和group2这2个组,默认组为group1,如果file所属组为group2,则-G file测试条件是不满足的,因为比较的是默认组,虽然用户也属于group2,但是group2不是用户的默认组。
复合条件测试
if-then语句允许你使用布尔逻辑来组合测试。有两种布尔运算可用:
- [ condition1 ] && [ condition2 ]
- [ condition1 ] || [ condition2 ]
if-then的高级特性
使用双圆括号
格式如下:
(( expression ))
术语expression可以是任意的数学赋值或比较表达式。除了test命令使用的标准数学运算符,下表列出了双圆括号命令中会用到的其他运算符。
符号 | 描述 |
---|---|
val++ | 后增 |
val– | 后减 |
++val | 先增 |
–val | 先减 |
! | 逻辑求反 |
~ | 按位取反 |
** | 幂运算 |
<< | 左位移 |
>> | 右位移 |
& | 按位与 |
&& | 逻辑与 |
例如:
#!bin/bash
val1=10
if (( $val1 ** 2 > 90 ))
then
(( val2 = $val1 ** 2 ))
echo "The square of $val1 is $val2"
fi
输出结果为:
The square of 10 is 100
注:不需要将双圆括号中表达式里的大于号转义。
使用双方括号
双方括号命令提供了针对字符串比较的高级特性。
格式如下:
[[ expression ]]
双方括号里的expression使用了test命令中采用的标准字符串进行比较。但它提供了test命令未提供的另一个特性——模式匹配。在模式匹配中,你可以定义一个正则表达式来匹配字符串值。
#!/bin/bash
if [[ $USER == a* ]]
then
echo "Hello $USER"
else
echo "Sorry, I do not know you"
fi
双方括号命令匹配了$USER环境变量来看它是否以字母a开头。如果是的话,比较就会通过。
注:如上所示,if与双圆括号以及if与双方括号之间必须要有空格
参考:《Linux命令行与shell脚本编程大全(第2版)》