网上搜索比较运算符,会得到很多的博文,但是感觉都只讲到了其中的一部分,而且经常有错误。
在使用的时候,也容易踩坑,如缺少空格报错,或者结果应该是“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"-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" ]] #错误
GNU:Conditional-Constructs
GNU:Bash-Conditional-Expression
if else以及大于、小于、等于逻辑表达式
shell script 在if 的判断条件正则表达式=~中引号问题
后记:博文发表出来,没几个小时就被“码农教程”给盗取了,里面保留了我原滋原味的错误,而且那里应该也不会更新,希望不会害到一些人。
-----------------------------------------------------------
本文来自博客园,作者:小厨房,转载请注明原文链接:https://www.cnblogs.com/erichf/p/13458200.html,否则视为侵权
如有疑问,请站内留言 或加 QQ:②⑨⓪②② ⑦③⑦⑨
-----------------------------------------------------------