if (()) [[]] [] 条件表达式比较示例
阅读原文时间:2023年07月10日阅读:2

a、b的ASCII码是 097、098
ASCII码 参考 http://www.51hei.com/mcu/4342.html

1. if (())

a=3; b=2 时,
if (( a > b )); then echo $a; fi  输出:3
if (( a < b )); then echo $a; fi  输出:无结果

a=2; b=3 时,
if (( a > b )); then echo $a; fi  输出:无结果
if (( a < b )); then echo $a; fi  输出:2

if (()) 内比较的是变量,即使不带 $,并不是ASCII码比较。也可以用于比较数值(如 2、3的比较),但不能用于比较未定义的变量。

注意,这里不能写成 (),为无效表达式,会报语法错误。
使用双圆括号,且可以不带 $,前后和运算符之间均无空格要求,(( $i > $j )) 等效于 (( $i>$j ))、(($i>$j))、(( i > j ))、(( i>j ))和((i>j))

2. if [[]]

a=3; b=2 时,
if [[ a > b ]]; then echo $a; fi  输出:无结果
if [[ a < b ]]; then echo $a; fi  输出:3

a=2; b=3 时,
if [[ a > b ]]; then echo $a; fi  输出:无结果
if [[ a < b ]]; then echo $a; fi  输出:2

if [[]] 要求括号里的表达式前后必须有一个空格,格式如 if [[ xxx ]]。
当 if [[]] 用于字符串常量或变量比较时,表达式本身的运算符,如 <、>、==、!= ,其前后可以不加空格;
但当 if [[]] 用于数值比较时,表达式本身的运算符前后必须加空格,否则会得到相反的结果。
因此,一般的写法都是运算符前后加上空格。

注意:
不带 $ 时,比较的是字符串常量,即ASCII码比较,如果要进行变量值的比较,必须带上 $。也可以用于比较数值(如 2、3的比较)。
这里不能写成 [],当使用 < 或 > 运算符时为无效表达式,结果为不确定值,如:
a=2; b=3 时,
if [ $a < $b ]; then echo $a; fi  输出:2 if [ $a > $b ]; then echo $a; fi  输出:2
if [ a < b ]; then echo $a; fi  输出:2 if [ a > b ]; then echo $a; fi  输出:2
可以看到输出均为2。这里,无论对a、b 赋什么值,带不带 $,if 判断结果都为True,所以一定会执行 echo $a。比较数值(如 2、3的比较)也是无效的。

3. if []

上面的 if [] 判断之所以无效,是因为 [] 里面的 > 和 < 被当作重定向符使用了,需要进行转义:
a=2; b=3 时,
if [ $a \< $b ]; then echo $a; fi  输出:2
if [ $a \> $b ]; then echo $a; fi  输出:无结果
if [ a \< b ]; then echo $a; fi  输出:2
if [ a \> b ]; then echo $a; fi  输出:无结果
if [ 2 \< 3 ]; then echo $a; fi  输出:2
if [ 2 \> 3 ]; then echo $a; fi  输出:无结果

if [] 要求括号里的表达式前后必须有一个空格,格式如 if [[ xxx ]],至于表达式本身的运算符无该要求。跟 if [[]] 一样。

注意:
当变量被赋值为数字时,和数值比较一样,可以使用如 -lt、-gt运算符替代 \< 和 \>;
当变量被赋值为字符串时,则跟字符串比较一样,只能使用 \< 和 \>。
这里 a、b 不带 $ 时作为字符串常量用于比较,字符串的比较可以简单参考26个字母表,越往后越大多个字符时,从左右往右逐位比较。

例如:
baa \< bc    结果:True
baa \< bab    结果:True
azzz \< baaa    结果:True
可以看出,最典型的,只要第一位“小”,整个字符串就“小”。