# shell中的流控制if语句
简单的脚本可以只包含顺序执行的命令,但结构化命令允许根据条件改变程序执行的顺序。
# if语句
# if-then语句
if-then
语句格式如下:
if command
then
commands
fi
在其他编程语言中, if
语句之后的对象是一个等式,这个等式的求值结果为 TRUE
或 FALSE
。bash shell
的 if
语句会运行 if
后面的那个命令。如果该命令的退出状态码是0
,位于 then
部分的命令就会被执行。
#!/bin/bash
if pwd
then
echo "pwd worked"
fi
输出:
# rob@xx-rob:~$ ./test1
/home/rob
pwd worked
# if-then-else 语句
格式:
if command
then
commands
else
commands
fi
示例:
v=bin
if grep $v pwd
then
echo "pwd worked"
else
echo "cannot find $v"
fi
结果:
rob@xx-rob:~$ ./test1
# grep: pwd: 没有那个文件或目录
# cannot find bin
if
还可以嵌套多层:
if command1
then
command set 1
elif command2
then
command set 2
elif command3
then
command set 3
elif command4
then
command set 4
fi
# test命令
bash shell if
语句的条件是command
,如果要使用常规的数值/字符串比较条件,需要使用test
命令。
使用test
命令的if-then-fi
语句:
if test condition
then
commands
fi
如果不写 test
命令的condition
部分,它会以非零的退出状态码退出,并执行 else
语句块。
加入条件时,test
命令会测试该条件。
bash shell
中 test
命令的另外一种写法是使用[ condition ]
中括号,第一个方括号之后和第二个方括号之前必须加上一个空格,
否则就会报错。
if
中条件判断的几个条件:
- 判断变量是否有值
if test ${variable}
- 数值比较
- 字符串比较
- 文件比较
# 数值比较
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 |
#!/bin/bash
if test 100 -le 145; then
echo "100 is smaller than 145"
fi
v=12
if [ $v -eq 12 ];then
echo "value is 12"
fi
bash shell
只能处理整数,不能使用浮点数作为判断条件。
# 字符串比较
bash shell
条件测试还允许比较字符串值,比较字符串比较烦琐。
比较 | 描述 |
---|---|
str1 = str2 | 检查 str1 是否和 str2 相同 |
str1 != str2 | 检查 str1 是否和 str2 不同 |
str1 < str2 | 检查 str1 是否比 str2 小 |
str1 > str2 | 检查 str1 是否比 str2 大 |
-n str1 | 检查 str1 的长度是否非0 |
-z str1 | 检查 str1 的长度是否为0 |
在bash sehll
中比较运算符需要使用转义,否则会被当成重定向运算符。
s1="val"
s2="thi"
# 升成`thi`的文件
if [ $s1 > $s2 ];
then
echo "new file $v2 has been created."
fi
if [ $s1 \> $s2 ];
then
echo "$s1 is greater than $s2."
fi
比较测试中使用的是标准的ASCII
顺序,根据每个字符的ASCII
数值来决定排序结果。在比较测试中,大写字母被认为是小于小写字母的。
# 文件比较
测试Linux
文件系统上文件和目录的状态。
命令 | 描述 |
---|---|
-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 新 |
file1 -ot file2 | 检查 file1 是否比 file2 旧 |
if-then
语句允许你使用布尔逻辑来组合测试,有两种布尔运算符可用:
[ condition1 ] && [ condition2 ]
[ condition1 ] || [ condition2 ]
# case
语句
在尝试计算一个变量的值,在一组可能的值中寻找特定值,可能不得不写出很长的 if-then-else
语句。case
命
令会采用列表格式来检查单个变量的多个值。
case variable in
pattern1 | pattern2) commands1;;
pattern3) commands2;;
*) default commands;;
esac
一个例子:
c=1
case $c in
1 | 2) echo "1";;
3) echo "23";;
esac