|
入门级,仅供新手参考。
下面是个实例:
- a=""
- b=0
- if [ "$a" != 0 -a "$b" == 0 ]; then
- echo "yes"
- fi
- #################################
- if [ $a != 0 -a $b == 0 ]; then
- echo "yes"
- fi
复制代码
上下两种粗略看起来是一样的,大多数时候都不会出现问题。但是事有例外。
上方有双引号,下方无双引号。
下面是运行过程:
- a=""
- + a=
- b=0
- + b=0
- if [ "$a" != 0 -a "$b" == 0 ]; then
- echo "yes"
- fi
- + '[' '!=' 0 -a 0 '==' 0 ]
- + echo yes
- yes
- if [ $a != 0 -a $b == 0 ]; then
- echo "yes"
- fi+ '[' '!=' 0 -a 0 '==' 0 ]
- sh: 0: unknown operand
复制代码 下方判断直接报错。
a不等于0的情况有很多种,比如a不存在,或者a是1-9中任意数值。我们理所当然认为a不存在时,也应该归入a不等于0判断。
出现问题的原因是,当变量为空时,无双引号就无法进行比较。为避免这种情况,最好都用双引号。
如何已经存在的脚本,太复杂心思去改那么多了,可以当a不存在时,人为赋予一个不是0的值:[ -z "$a" ] && a=1(我们只需要关心它不是0,到底是1还是9毫无关系) ,这样就避免问题了。
但是我要想a为空时不执行判断怎么办?好办得很嘛:
- if [ -n "$a" ] && [ "$a" != 0 -a "$b" == 0 ]; then
- echo "yes"
- fi
复制代码
这样就行了。-n表示存在(相反,-z表示不存在)。[ -n "$a" ]判断通过后才会执行&&后面的,否则就在这里终止。另外,上面的例子跟:
- if [ -n "$a" ] ; then
- if [ "$a" != 0 -a "$b" == 0 ]; then
- echo "yes"
- fi
- fi
复制代码 意义是一样的,属于2重判断,而不是2条件判断。
题外话:a=1是赋予一个实际的值,那么要赋予一个空值呢? a=""就是赋予空值(本来a= 也是可以,但是避免歧义,要习惯使用"")。
题外话:[ "$b" == 0 ]与 [ "$b" = 0 ]有什么区别?使用==的是数值比较,比较的条件仅限于于数值(数值仅有数字,无空格等其它字符),使用=的是字符比较,比较的条件可以是任意字符。本来,最基本用法应该是这样:[ "$b" == “110” ]、[ "$b" = “ll0" ],即两边都用双引号,为何?因为双引号内所有字符才会被认为是一个整体,比如使用[ "$b" = ll 0 ],会直接报错,但使用[ "$b" = "ll 0" ]就毫无问题,条件判断这里所以要养成使用""的习惯。
题外话:[ "$b" == 0 ]与 [ "$b" = 0 ]这些”等于“的判断知道怎么用了,那么不等于呢?shell中没有不等于号定义,但是有取反符合定义”!"。[ "$b" == 0 ]与 [ "$b" != 0 ]有什么区别?两者都是数值比较,==与!=是一样的用法。当要作为字符比较不等于怎么办?可以这样:[ ! "$b" = "aa0" ],表示判断之后取反。而使用[ "$b" != "aa0" ]是不规范的。
但是有一个地方的变量不能使用"",就是:
while
do
xxx $a
done
这种循环语句,使用了多数会报错,但这里不是条件判断的使用范围了。
|
|