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 是否大于或等于 n2n1 -gt n2 检查 n1 是否大于 n2n1 -le n2 检查 n1 是否小于或等于 n2n1 -lt n2 检查 n1 是否小于 n2n1 -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
