Bash能够执行各种测试。我们可以用if
、if else
以及逻辑运算符来测试,用比较运算符来比较数据项。除此之外,还有一个test
命令也可以用于测试。
-
if
if condition; # 有分号 then commands; fi
-
else if 和 else
if condition; then commands; else if condition; then commands; else commands; fi
-
if 和 else 语句能够嵌套使用。 if的条件判断部分可能会变得很长,但可以用逻辑运算符将它变得简洁一些:
[ condition ] && action;
# 如果condition为真,则执行action
[ condition ] || action;
# 如果condition为假,则执行action&&
是逻辑与运算符,||
是逻辑或运算符。 -
算术比较
比较条件通常被放置在封闭的中括号内。一定要注意在[
或]
或两者与操作数之间有一个空格。如果忘记了这个空格,脚本就会报错。[ $var -eq 0 ] #当$var等于0时,返回真 [ $var -ne 0 ] #当$var不为0时,返回真
其他重要的操作符如下:
-gt
:大于。
-lt
:小于。
-ge
:大于或等于。
-le
:小于或等于。-a
是逻辑与操作符,-o
是逻辑或操作符。可以按照下面的方法结合多个条件进行测试:[ $var1 -ne 0 -a $var2 -gt 2 ] #使用逻辑与-a [ $var1 -ne 0 -o $var2 -gt 2 ] #逻辑或-o
注意:-a 和 -o 是用于同一个中括号之内的多个条件判断之间的逻辑操作符;&& 和 || 是用于多个中括号之间的条件判断的逻辑操作符。
-
文件系统相关测试
[ -f $file_var ]
:如果给定的变量包含正常的文件路径或文件名,则返回真。
[ -x $var ]
:如果给定的变量包含的文件可执行,则返回真。
[ -d $var ]
:如果给定的变量包含的是目录,则返回真。
[ -e $var ]
:如果给定的变量包含的文件存在,则返回真。
[ -c $var ]
:如果给定的变量包含的是一个字符设备文件的路径,则返回真。
[ -b $var ]
:如果给定的变量包含的是一个块设备文件的路径,则返回真。
[ -w $var ]
:如果给定的变量包含的文件可写,则返回真。
[ -r $var ]
:如果给定的变量包含的文件可读,则返回真。
[ -L $var ]
:如果给定的变量包含的是一个符号链接,则返回真。 -
字符串比较
进行字符串比较时,最好用双中括号,因为有时候采用单个中括号会产生错误。-
测试两个字符串是否相同
[[ $str1 = $str2 ]]
:当str1等于str2时,返回真。也就是说, str1和str2包含的文本是一模一样的。
[[ $str1 == $str2 ]]
:这是检查字符串是否相同的另一种写法。 -
测试两个字符串是否不同
[[ $str1 != $str2 ]]
:如果str1和str2不相同,则返回真。 -
字符串大小比较
字符串是依据字符的ASCII值进行比较的。
[[ $str1 > $str2 ]]
:如果str1的字母序比str2大,则返回真。
[[ $str1 < $str2 ]]
:如果str1的字母序比str2小,则返回真。
注意:在
=
前后各有一个空格。如果忘记加空格,那就不是比较关系了,而是变成了赋值语句。- 测试空串
[[ -z $str1 ]]
:如果str1为空串,则返回真。
[[ -n $str1 ]]
:如果str1不为空串,则返回真。
-
使用逻辑运算符 &&
和 ||
能够很容易地将多个条件组合起来:
if [[ -n $str1 ]] && [[ -z $str2 ]] ;
then
commands;
fi
test
命令可以用来测试条件。用test可以避免使用过多的括号,增强代码的可读性。之前讲过的[]
中的测试条件同样可以用于test命令。例如,
if [ $var -eq 0 ]; then echo "True"; fi
# 也可以写成:
if test $var -eq 0 ; then echo "True"; fi