Linux中可以通过test等命令对命令执行结果进行判断,即执行过后的$?变量的值,如果值为0则被if条件视为真;反之,任何非0数值均会被if条件视为假。
如:

if [ -n $SHELL ] ; then echo “I’m in shell $SHELL” fi

但是这个判断条件过于简陋粗糙,仅能对0和非0这两种情况进行判断真假,为此Linux中提供了test命令,供我们进行更多细致的判断。
当然,如果脚本中每次都写上test命令未免太过凡所,也可以写成[ condition ]的形式,以下是判断条件的总结:

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

字符串比较

str1 = str2 检查 str1 是否和 str2 相同
str1 != str2 检查 str1 是否和 str2 不同
str1 < str2 检查 str1 是否比 str2 小
str1 > str2 检查 str1 是否比 str2 大
-n str1 检查 str1 的长度是否非0
-z str1 检查 str1 的长度是否为0

注意,比较字符串时>号需要转移,写成\>的形式,否则会被shell视为重定向

文件比较

-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 旧

复合条件的比较

有两种符合条件的操作符,分别为&&||,分别表示and和or的意思。

if-then的更多高级特性

双括号(())

命令格式如(( expression )),其中expression可以是任意数学表达式或比较表达式,除了标准的数学运算符以外,双括号还支持如下的其他运算符
val++ 后增
val-- 后减
++val 先增
--val 先减
! 逻辑求反
~ 位求反
** 幂运算
<< 左位移
>> 右位移
& 位布尔和
| 位布尔或
&& 逻辑和
|| 逻辑或

双方括号[[]]

命令格式如[[ expression ]],双方括号提供了针对字符串比较的高级特性,除了标准的字符串比较,还提供了名为模式匹配的特性,可以定义一个正则表达式来匹配字符串值,例如:

if [ $USER == “rich*” ] then echo “Welcome $USER” echo “Please enjoy your visit” fi

case条件

多个if-elif结构可以使用case来代替,命令格式如:

case variable in pattern1 | pattern2) commands1;; pattern3) commands2;; *) default commands;; esac

使用例子如下

case $USER in rich | barbara) echo “Welcome, $USER” echo “Please enjoy your visit”;; testing) echo “Special testing account”;; jessica) echo “Do not forget to log off when you’re done”;; *) echo “Sorry, you are not allowed here”;; esac