if-then语句
格式如下:
if commad
then
commands
fi
bash shell的if语句会运行if行定义的那个命令。如果该命令的退出状态码是0(该命令行成功运行),位于then部分的命令就会被执行。如果该命令的退出状态码是其他什么值,then部分的命令就不会执行。
if-then-else语句
格式如下:
if command
then
commands
else
commands
fi
嵌套if
格式如下:
if command1
then
commands
elif command2
then
more commands
fi
test命令
test命令提供了在if-then语句中测试不同条件的途径。如果test命令中列出的条件成立,test命令就会退出并返回状态码0.
test格式非常简单:test condition
当用在if-then语句中,test命令看起来是这样的:
if test condition
then
commands
fi
bash shell提供了另一种在if-then语句中声明test命令的方法:
if [ condition ]
then
commands
fi
方括号定义了test命令中用到的条件。注意,左括号右侧和右括号左侧都需加一个空格,否则会报错。
test命令可以判断3类条件:
- 数值比较
- 字符串比较
- 文件比较
数值比较
test命令的数值比较功能
比较 | 描述 |
---|---|
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 |
字符串比较
test命令的字符串比较功能
比较 | 描述 |
---|---|
str1 = str2 | 检查str1是否和str2相同 |
str1 != str2 | 检查str1是否和str2不同 |
str1 < str2 | 检查str1是否比str2小 |
str1 > str2 | 检查str1是否比str2大 |
-n str1 | 检查str1的长度是否非0 |
-z str1 | 检查str1的长度是否为0 |
比较字符串相等性时,test会将所有标点和大写也考虑在内。
比较字符串顺序时,大于小于符号必须转义,否则会理解为重定向符;大于小于顺序和sort命令所采用的不同。
文件比较
test命令的文件比较功能
比较 | 描述 |
---|---|
-d file | 检查file是否存在并是一个目录 |
-e file | 检查file是否存在 |
-f file | 检查file是否存在并是一个文件 |
-r file | 检查file是否存在并可读 |
-s file | 检查file是否存在并非空 |
-w file | 检查file是否存在并可写 |
-x file | 检查file是否存在并可执行 |
-O file | 检查file是否存在并属于当前用户所有 |
-G file | 检查file是否存在并且默认组和当前用户相同 |
file1 -nt file2 | 检查file1是否比file2新 |
复合条件测试
有两种布尔运算符可用:
[ condition ] && [ condition2 ]
[ condition ] || [ condition2 ]
if-then高级特性
双尖括号
命令格式如下:
((expression))
术语expression可以是任意的数学赋值或比较表达式。双尖括号命令中会用到的其他运算符如下:
符号 | 含义 |
---|---|
val++ | 后增 |
val– | 后减 |
++val | 先增 |
–val | 先减 |
! | 逻辑求反 |
~ | 位求反 |
** | 幂运算 |
<< | 左位移 |
>> | 右位移 |
& | 位布尔和 |
| | 位布尔或 |
&& | 逻辑和 |
|| | 逻辑或 |
双方括号
格式如下:[[ expression ]]
双括号里的expression使用了test命令中采用的标准字符串进行比较。它还提供了test命令未提供的另一个特性—-模式匹配。例如你可以定义一个正则表达式来匹配字符串:
if [[ $USER == r* ]]
双方括号命令匹配$USER环境来看它是否以字母r开头。如果是的话,比较就会通过。
case命令
使用case命令,而不用写出那么多elif语句来不断检查相同变量值。case命令会检查单个变量列表格式的多个值:
case variable in
pattern1 | pattern2) commands1::
pattern3) commands2::
*) default commands::
esac