Shell 比较与测试,程序中的流程控制是由比较语句和测试语句处理的。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
&&
是逻辑与运算符,||
是逻辑或运算符。编写Bash脚本时,这是一个很有用的技巧。
现在来了解一下条件和比较操作。
- 算术比较比较条件通常被放置在封闭的中括号内。一定要注意在
[
或]
与操作数之间有一个空格。如果忘记了这个空格,脚本就会报错。
[var -eq 0 ] or [var -eq 0]
对变量或值进行算术条件测试:
[ var -eq 0 ] #当var等于0时,返回真
[ var -ne 0 ] #当var不为0时,返回真
其他重要的操作符如下:
-gt
:大于。-lt
:小于。-ge
:大于或等于。-le
:小于或等于。
-a
是逻辑与操作符,-o
是逻辑或操作符。可以按照下面的方法结合多个条件进行测试:
[ var1 -ne 0 -avar2 -gt 2 ] #使用逻辑与-a
[ var1 -ne 0 -ovar2 -gt 2 ] #逻辑或-o
文件系统相关测试
我们可以使用不同的条件标志测试各种文件系统相关的属性。
[ -f $file_var ]
:如果给定的变量包含正常的文件路径或文件名,则返回真。[ -x $var ]
:如果给定的变量包含的文件可执行,则返回真。[ -d $var ]
:如果给定的变量包含的是目录,则返回真。[ -e $var ]
:如果给定的变量包含的文件存在,则返回真。[ -c $var ]
:如果给定的变量包含的是一个字符设备文件的路径,则返回真。[ -b $var ]
:如果给定的变量包含的是一个块设备文件的路径,则返回真。[ -w $var ]
:如果给定的变量包含的文件可写,则返回真。[ -r $var ]
:如果给定的变量包含的文件可读,则返回真。[ -L $var ]
:如果给定的变量包含的是一个符号链接,则返回真。
考虑下面的例子:
fpath="/etc/passwd"
if [ -e $fpath ]; then
echo File exists;
else
echo Does not exist;
fi
字符串比较
进行字符串比较时,最好用双中括号,因为有时候采用单个中括号会产生错误。
注意,双中括号是Bash的一个扩展特性。如果出于性能考虑,使用ash或dash来运行脚本,那么将无法使用该特性。
测试两个字符串是否相同。
[[ str1 =str2 ]]
:当str1
等于str2
时,返回真。也就是说,str1
和str2
包含的文本是一模一样的。[[ str1 ==str2 ]]
:这是检查字符串是否相同的另一种写法。
测试两个字符串是否不同。
[[ str1 !=str2 ]]
:如果str1
和str2
不相同,则返回真。
找出在字母表中靠后的字符串。
字符串是依据字符的ASCII值进行比较的。例如,A的值是0x41,a的值是0x61。因此,A小于a,AAa小于Aaa。
[[ str1>str2 ]]
:如果str1
的字母序比str2
大,则返回真。[[ str1<str2 ]]
:如果str1
的字母序比str2
小,则返回真。
注意在
=
前后各有一个空格。如果忘记加空格,那就不是比较关系了,而是变成了赋值语句。
测试空串。
[[ -z $str1 ]]
:如果str1
为空串,则返回真。[[ -n $str1 ]]
:如果str1
不为空串,则返回真。
使用逻辑运算符 &&
和 ||
能够很容易地将多个条件组合起来:
if [[ -n str1 ]] && [[ -zstr2 ]] ;
then
commands;
fi
例如:
str1="Not empty "
str2=""
if [[ -n str1 ]] && [[ -zstr2 ]];
then
echo str1 is nonempty and str2 is empty string.
fi
输出如下:
str1 is nonempty and str2 is empty string.
test
命令可以用来测试条件。用test
可以避免使用过多的括号,增强代码的可读性。之前讲过的[]
中的测试条件同样可以用于test
命令。例如:
if [ $var -eq 0 ]; then echo "True"; fi
也可以写成:
if test $var -eq 0 ; then echo "True"; fi
注意,
test
是一个外部程序,需要衍生出对应的进程,而 [ 是Bash的一个内部函数,因此后者的执行效率更高。test
兼容于Bourne shell、ash、dash等。