expr的坑
expr 是用来对数值进行计算的命令,命令的前后参数需要用空格隔开
[root@localhost ~]# whatis expr
expr (1) – evaluate expressions 表达式求值
expr命令被用做表达式求职计算,但是 expr计算的结果为0的时候,将会被认为是错误的,不能作为条件判断的依据
例如:
[root@localhost ~]# expr 1 + 2
3
expr还可以对变量的值进行计算
[root@localhost ~]# n=3;expr $n + 2
5
但命令执行后是否成功呢??
$? 是shell中显示命令执行结果是否正确的内置变量,如果执行结果的值为0,表示命令正确执行
使用一个未定义的变量试试
[root@localhost ~]# expr $x + 2;echo $?
2
0
坑!
#结果是对的
[root@localhost ~]# expr $y + 0
0
#被判定为命令执行失败
[root@localhost ~]# echo $?
1
[root@localhost ~]# y=10;expr $y + 0
10
[root@localhost ~]# echo $?
0
原因
expr的执行结果如果是0,将会被 $? 认为命令执行失败。expr不能轻易用于作为条件判断,有时候不能当做条件判断的依据
在expr命令的帮助文档中有一句描述:Exit status is 0 if EXPRESSION is neither null nor 0, 1 if EXPRESSION is null or 0, 2 if EXPRESSION is syntactically invalid, and 3 if an error occurred.
也就是说,如果表达式的执行结果为null或者0,就认为执行的最终结果为1[命令执行失败],否则为0[命令执行成功]
类似的情况
let的坑
[root@localhost ~]# i=0;let i++;echo $?
1
[root@localhost ~]# i=0;let ++i;echo $?
0
[root@localhost ~]# let m=0;echo $?
1
查一下let的帮助
help let
和expr类似的情况
Exit Status:If the last ARG evaluates to 0, let returns 1; let returns 0 otherwise.
[root@localhost ~]# i=10;j=-10;
[root@localhost ~]# let sum=i+j
执行结果是对的,但被判定为执行命令失败
[root@localhost ~]# echo $sum
0
[root@localhost ~]# echo $?
1
例如想计算出两个数的值就输出,则会出现不能成功输出计算得出值得情况,就是因为前一条命令被判定为执行失败,使用短路与的命令,后续不执行导致的,所以,只能把一条命令拆成2条命令去写
[root@localhost ~]# let sum=i+j && echo $sum
[root@localhost ~]# let sum=i+j ;echo $sum
0
用于条件判断的命令如果不严谨,将会导致一些无法预料的事情发生!
在做变量测试时候遇到的另一个坑
test命令
- 长格式的例子:
test “$A” == “$B” && echo “Strings are equal”
test “$A” -eq “$B” && echo “Integers are equal”
- 简写格式的例子:
[ “$A” == “$B” ] && echo “Strings are equal”
[ “$A” -eq “$B” ] && echo “Integers are equal”
[root@localhost ~]# whatis test
test (1) – check file types and compare values 检查文件类型和值进行比较
[root@localhost ~]# help test
test: test [expr]
Evaluate conditional expression.
其中有一个参数
-n STRING
STRING True if string is not empty. 如果字符串不为空表示为真
test的坑
测试成功返回0.测试失败返回255以内的数
[$name 是一个不存在的变量]
[root@localhost ~]# [ -n $name ] 为空的变量测试为真???what??
[root@localhost ~]# echo $?
0 竟然 测试成功
[root@localhost ~]# echo $name $name没有值
[root@localhost ~]# name=wang 给$name 赋值
[root@localhost ~]# [ -n $name ] 测试[如果变量不为空则为true]
[root@localhost ~]# echo $?
0 OK,没问题
[root@localhost ~]# unset name 删除$name变量,此时$name的值为空,测试时应该表现为假才对
[root@localhost ~]# [ -n $name ] ???不对了
[root@localhost ~]# echo $?
0 删除变量$name后,此时测试应该表现为失败,返回其他数字
[root@localhost ~]# test -n $name;echo $?
0
[root@localhost ~]# [[ -n $name ]]
[root@localhost ~]# echo $?
1
[root@localhost ~]# echo $name
#由于之前已经删掉了$name变量的值,所以已经为空,不为空表示为真,为空表现为假,所以一下的测试都是失败的
[root@localhost ~]# [ -n “$name” ] 加上双引号进行测试
[root@localhost ~]# echo $?
1 由于已经unset掉了$name,所以测试的语句的返回值是其他数,这里是对的
[root@localhost ~]# test -n “$name” 加上引号测试变量
[root@localhost ~]# echo $?
1 由于已经unset掉了$name,所以测试的语句的返回值是其他数,这里是对的
不加引号,判断出来全是真,这是一个坑!坑!坑!
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/88818