字符串顺序及⼤⼩⽐较注意事项
字符串顺序及⼤⼩⽐较注意事项
字符串顺序
当要使⽤测试条件的⼤于或⼩于功能时,会出现两个经常困扰 shell 程序员的问题
1. ⼤于号和⼩于号必须转义,否则 shell 会将⼤于和⼩于号(>, <)当作重定向符号,把字符串值当作⽂件名
#cat badtest.sh
#!/bin/bash
# mis-using string comparisons
#
v1=baseball
v2=hockey
#
if [ $v1 > $v2 ]
then
echo "$v1 is greater than $v2"
else
echo "$v1 is less than $v2"
fi
#sh badtest.sh
baseball is greater than hockey
badtest.sh 脚本中使⽤⼤于号来⽐较字符串,执⾏脚本未报错,但结果是错的。脚本将⼤于号解释成输出重定向。因此创建了⼀个名为hockey 的⽂件。由于重定向的完成,test 命令返回退出状态码 0, if 语句便以为所有命令成功结束,从⽽执⾏ then 部分语句。
要解决此问题,需要对⼤于号进⾏转义
#cat test9.sh
#!/bin/bash
# mis-using string comparisons
#
v1=baseball
v2=hockey
#
if [ $v1 \> $v2 ]
then
echo "$v1 is greater than $v2"
else
echo "$v1 is less than $v2"
fi
#sh test9.sh
baseball is less than hockey
1. ⼤于和⼩于顺序和 sort 命令所采⽤的不同
sort 命令处理⼤写字母的⽅法和 test 命令相反
v2=testing
#
if [ $v1 \> $v2 ]
then
echo "$v1 is greater than $v2"sort命令排序
else
echo "$v1 is less than $v2"
fi
#sh test9b.sh
Testing is less than testing
#cat testfile
Testing
testing
#sort testfile
testing
Testing
在脚本 test9b.sh 的⽐较测试中,⼤写字母被认为是⼩于⼩写字母的。但 sort 命令对 testfile ⽂件内容的排序与之相反,当做同样的字符串放进⽂件中并⽤sort排序时,⼩写字母会先出现。
⽐较测试和 sort 命令结果不⼀致原因
⼆者所采⽤的排序技术不同,⽐较测试遵循的是每个字符的ASCII数值,⽽sort命令使⽤的是系统的本地化语⾔设置中定义的排序顺序。对于英语,本地化设置指定了在排序顺序中⼩写字母出现在⼤写字母前
说明
test命令和测试表达式使⽤标准的数学⽐较符号来表⽰字符串⽐较,⽽⽤⽂本代码来表⽰数值⽐较。这个细微的特性被很多程序员理解反了。如果你对数值使⽤了数学运算符号, shell会将它们当成字符串值,可能⽆法得到正确的结果。
字符串⼤⼩
-n and -z可检查⼀个变量是否含有数据
⽐较描述
-n str1检查str1的长度是否⼤于0
-z str1检查str1的长度是否等于0
变量分为三种情况
变量值
1有值,如'string'
2为空,如''
3未定义变量
测试⽅法
对变量的三种情况分别以选项-n and -z测试
var2=''
#
if [ -n $var1 ]
then
echo "-n option, The string '$var1' is not empty"
else
echo "-n option, The string '$var1' is empty"
fi
if [ -z $var1 ]
then
echo "-z option, The string '$var1' length is 0"
else
echo "-z option, The string '$var1' is not empty"
fi
#
if [ -n $var2 ]
then
echo "-n option, The string '$var2' is not empty'"
else
echo "-n option, The string '$var2' is empty"
fi
if [ -z $var2 ]
then
echo "-z option, The string '$var2' length is 0"
else
echo "-z option, The string '$var2' is not empty"
fi
#
if [ -n $var3 ]
then
echo "-n option, The string '$var3' is not empty"
else
echo "-n option, The string '$var3' is empty"
fi
if [ -z $var3 ]
then
echo "The string '$var3' length is 0"
else
echo "The string '$var3' is not empty"
fi
这个例⼦创建了两个字符串变量。 val1变量包含了⼀个字符串, val2变量包含的是⼀个空
字符串。后续的⽐较如下:
if [ -n $val1 ]
判断val1变量是否长度⾮0,⽽它的长度正好⾮0,所以then部分被执⾏了。
if [ -z $val1 ]
判断val1变量是否长度为0,⽽它的长度⾮0,所以else部分被执⾏了。
if [ -n $var2 ]
if [ -z $var2 ]
判断val2变量是否长度为0,⽽它正好长度为0,所以then部分被执⾏了。
if [ -n $val3 ]
if [ -z $val3 ]
判断val3变量是否长度为0。这个变量并未在shell脚本中定义过,所以它的字符串长度仍然为0,尽管它未被定义过。
存在问题
对空字符串和未定义变量的长度计算需注意
if [ -n $var2 ]
if [ -n $var3 ]
空字符串长度⽐较测试
#cat empty_str_len.sh
#!/bin/bash
#
v1=''
#
if [ -n $v1 ]
then
echo "The length of $v1 is greater than 0"
else
echo "The length of $v1 is less than 0"
fi
#sh empty_str_len.sh
The length of  is greater than 0
未定义变量长度⽐较测试
#cat empty_str_len.sh
#!/bin/bash
#
v1=''
#
if [ -n $v2 ]
then
echo "The length of $v1 is greater than 0"
else
echo "The length of $v1 is less than 0"
fi
#sh empty_str_len.sh
The length of  is greater than 0
结论
-n str 认为空字符串和未定义变量的长度是⼤于0的
窍门
空的和未初始化的变量会对shell脚本测试造成灾难性的影响。如果不是很确定⼀个变量的内容,最好在将其⽤于数值或字符串⽐较之前先通过-n或-z来测试⼀下变量是否含有值。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。