Shell脚本中的字符串测试

作为一个实用的、能解决实际问题的Shell脚本程序,必须能够根据执行过程中的各种实际情况来做出正确的选择。Shell提供了一系列的条件测试来处理程序执行过程中的各种情况,并进一步操作。本节将介绍各种条件测试的基本语法,以及Shell程序的基本流程控制语句判断语句的使用。

条件测试

在Shell程序中,用户可以使用测试语句来测试指定的条件表达式的真或假。当指定的条件为真时,整个条件的测试返回值为0;反之,如果指定的条件为假,则条件测试语句的返回值为非0的数值。 在Shell程序中,条件测试中指定的条件为真时,条件测试的返回值为0,这主要是为了保持与Shell程序的退出状态一致。当某一个Shell程序成功执行时,该进程会返还一个0数值;而如果该程序执行错误,则会返回一个非0数值 。

条件测试的语法主要有两种,分别是test和[命令。

字符串的测试

在Shell中,可以通过5种运算符来对字符串进行操作。如下所示:

string               判断指定的字符串是否为空
string1 = string2    判断连个字符串string1是string2是否相等
string1 != string2   判断连个字符串string1是string2是否不相等
-n string            判断string是否是非空串
-z string            判断string字符串是否是空串

在进行字符串的测试时,用引号将字符串界定起来是一个非常好的习惯。

演示Shell中字符串测试的使用方法

#定义字符串变量
[root@VM_156_149_centos shell]# a="abc"

#使用test命令测试变量$a是否为空串
[root@VM_156_149_centos shell]# test $a
#输出测试结果
[root@VM_156_149_centos shell]# echo $?
#echo $?的输出结果为0,表示变量$a的值不为空
0

#使用test命令测试变量$a是否不为空
[root@VM_156_149_centos shell]# test -n "$a"
#输出测试结果
[root@VM_156_149_centos shell]# echo $?
#echo $?的输出结果为0,表示变量$a为非空串
0

#使用test命令测试变量$a是否为空串
[root@VM_156_149_centos shell]# test -z "$a"
#输出测试结果
[root@VM_156_149_centos shell]# echo $?
#echo $?的输出结果为1,表示变量$a不是空串
1

注意: 在进行变量赋值的时候,等号”=”的左右两边一定不要有空格;否则,Shell会把空格前面的字符串当做Shell命令来解析。

演示Shell中字符串的比较

#定义两个变量
[root@VM_156_149_centos shell]# a="hello"
[root@VM_156_149_centos shell]# b="world"

#比较两个字符串是不是相等
[root@VM_156_149_centos shell]# [ $a = $b  ]
# echo $?的返回值为1,表示两个字符串变量不相等
[root@VM_156_149_centos shell]# echo $?
1

#比较两个字符串是不是不相等
[root@VM_156_149_centos shell]# [ $a != $b  ] 
# echo $?的返回值为0,表示两个字符串变量是不相等
[root@VM_156_149_centos shell]# echo $?
0

初学者容易犯的错误

在Shell脚本中的字符串的比较里面,有一个初学者容易犯的错误。下面进行讲解。观察下面代码的执行结果,

[root@VM_156_149_centos shell]# a="Apple"
[root@VM_156_149_centos shell]# b="Orange"
[root@VM_156_149_centos shell]# test "$a"="$b"
[root@VM_156_149_centos shell]# echo $?
0

从表面上看,这个例子与前面介绍片的几个例子没有太大的区别。其中 a"Apple", b的值是”Orange”。但是,第5行的比较结果为0.我们知道,0意味着这两个字符串的值是相等的。而在第一行和第二行,这两个变量的数值明显是不一样的。那么究竟是哪个地方出了问题那?
实际上问题出在第三行, 根据Shell的要求,运算符的左右两边必须保留空格,而在上面的例子中,表达式被写成了下面的形式:

test "$a"="$b"

在上面的情况下,Shell并不认为其中的”=”是一个字符串的运算符,而是看成一个普通的字符。所以,上面的例子实际上相当于执行下面的字符串测试:

[root@VM_156_149_centos shell]# a="Apple"
[root@VM_156_149_centos shell]# b="Orange"
[root@VM_156_149_centos shell]# test "$a"="$b"
[root@VM_156_149_centos shell]# echo $?
0

也就是说,实际上测试的是字符串是否为空。上面的字符串”Apple=Orange”当然不为空串,所以是上面的测试结果为0.

注意

在字符串的测试运算时,”=”、”!=”,以及”-z”等符号的左右两边,一定含有一个空格。

你可能感兴趣的:(Shell,shell,测试)