Shell 比较与测试

Shell 比较与测试,程序中的流程控制是由比较语句和测试语句处理的。Bash能够执行各种测试。我们可以用ifif else以及逻辑运算符来测试,用比较运算符来比较数据项。除此之外,还有一个test命令也可以用于测试。

Shell 比较与测试

实战演练

来看看用于比较和测试的各种方法:

  • if条件
if condition;
then
    commands;
fi
  • else ifelse
if condition;
then
    commands;
else if condition; then
    commands;
else
    commands;
fi

ifelse语句能够嵌套使用。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时,返回真。也就是说,str1str2包含的文本是一模一样的。
  • [[ str1 ==str2 ]]:这是检查字符串是否相同的另一种写法。

测试两个字符串是否不同

  • [[ str1 !=str2 ]]:如果str1str2不相同,则返回真。

找出在字母表中靠后的字符串
字符串是依据字符的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等。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程