网上搜索比较运算符,会得到很多的博文,但是感觉都只讲到了其中的一部分,而且经常有错误。
在使用的时候,也容易踩坑,如缺少空格报错,或者结果应该是“false”的表达式,结果却显示为“true”等等,时常让人摸不着头脑。通过官方文档,以及自己的探索,总结了各种运算符的使用条件,和容易出错的地方(有些内在的道理还不是很清楚),希望能给大家避点雷。

比较运算符分类:

  • = 符号,仅用于字符串比较,与==等价
  • 字符表示:大于:-gt, 小于:-lt, 大于等于:-ge, 小于等于: -le, 不等于:-ne, 等于:-eq
  • 符号表示:大于:> , 小于:< , 大于等于:>= , 小于等于: <= , 不等于:!= , 等于:==
  • 字符串正则匹配:=~

常用形式:

  • 用于单中括号[ ]中, 变量需要使用使用'$'符号,含 > 和 < 的符号时,需要使用'\'进行转义
if [ $a \> $b ]   
  • 用于双中括号[[ ]]中,变量需要使用使用'$'符号,比较运算符符号不需要转义(推荐使用)
if [[ $a > $b]]   
  • 用于双小括号(( ))中,变量可以不使用'$'符号,不需要使用转义,在代数比较时,只能用于整数比较(与C语言for循环中的判断条件语法相同)
if ((a > b))   

字符串的比较

  • 一般使用,!= 、==(或 =)、=~ ,分别表示:不等于、等于 和 正则匹配(成功匹配返回 1)
  • 偶尔使用:> 和 < , 其含义是比较字符的ascii编码大小
  • 使用test进行字符串比较,仅能使用 == 和 != 符号, == 可以简化为 =
  • 字符串正则匹配:=~, 一般放在[[]]中,可避免转义,注意:左右两边必须有空格,且右边不要使用引号,否则会匹配失败

整数比较

  • -gt, -lt,-ge,-le, -eq, -ne, 仅适用于\(\color{blue}{整数}\),且比较运算符左右两边必须有空格,否则会被整体视为一个字符串(非空字符串,恒为正)
a=2
b=1
[[ "$a"-gt"$b" ]]     #返回 1, 因为当成一个整体字符串,非空
[[ "$a"-lt"$b" ]]     #返回 1, 因为当成一个整体字符串,非空

[[ "$a" -gt "$b" ]]   #返回 1,因为 2 > 1
[[ "$a" -lt "$b" ]]   #返回 0,因为 2 > 1

[[ "$a" -lt"$b" ]]   #报错,缺少比较运算符,因为 把$a 和 -lt$b当成了2个字符串
[[ "$a"-lt "$b" ]]   #报错,同上

a=2.2
b=1.1
[[ "$a"-gt"$b" ]]     #返回 1, 因为当成一个整体字符串,非空
[[ "$a"-lt"$b" ]]     #返回 1, 因为当成一个整体字符串,非空

[[ "$a" -gt "$b" ]]   #报错[[: 2.2: syntax error: invalid arithmetic operator (error token is ".2"),因为识别不了2.2为整数
[[ "$a" -lt "$b" ]]   #报错, 同上
  • 使用 > ,< ,>= , <= , != ,== 时,运算符左右两边可以使用空格,也可以不使用空格

浮点数比较

  • 仅能使用使用 > ,< ,>= , <= , != ,== ,运算符左右两边不可以使用空格,不可使用字符型的比较运算符
[ "$a"\>="$b" ]       #正确
[ "$a" \>= "$b" ]     #错误

[[ "$a">="$b" ]]      #正确
[[ "$a" >= "$b" ]]    #错误

参考链接


后记:博文发表出来,没几个小时就被“码农教程”给盗取了,里面保留了我原滋原味的错误,而且那里应该也不会更新,希望不会害到一些人。