bash shell数值比较(-eq)与字符比较(==)的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bash shell数值比较(-eq)与字符比较(==)的区别相关的知识,希望对你有一定的参考价值。

运维中经常编写脚本时,如果遇到使用变量间歇取值并和整数进行比较时,大多数人第一时间会想到使用"-eq"进行比较,但事实中如果因特殊原因导致变量取值为空(null)时,bash shell会把null转换为0进行"-eq"比较,如果遇到此种困惑,可以把整数比较方法改为使用字符串比较(==),这样就可以很好的解决整数比较带来的这种bug。


为什么会有此文章,正是因为笔者在线上使用脚本运维的过程中,因此bug出现过两次失手,也给公司带来了带来了一些损失,经过仔细分析程序日志和脚本运行逻辑,加上如下测试过程,才真正找到了bug的所在以及解决办法。以下是笔者推敲思路,供大家分析之用。



[[email protected] ~]# echo $tables

[[email protected] ~]# echo $switch

[[email protected] ~]# [[ $tables -eq 0 ]] && switch=off || switch=on
[[email protected] ~]# echo $switch
off
[[email protected] ~]# unset switch
[[email protected] ~]# echo $switch

[[email protected] ~]# [[ $tables == ^$ ]] && switch=off || switch=on
[[email protected] ~]# echo $switch
on
[[email protected] ~]# unset switch
[[email protected] ~]# echo $switch

[[email protected] ~]# [[ $tables == [[:space:]] ]] && switch=off || switch=on
[[email protected] ~]# echo $switch
on
[[email protected] ~]# unset switch
[[email protected] ~]# echo $switch

[[email protected] ~]# [[ $tables == "" ]] && switch=off || switch=on
[[email protected] ~]# echo $switch
off
[[email protected]vefirewall ~]# unset switch
[[email protected] ~]# echo $switch

[[email protected] ~]# [[ 0 == "" ]] && switch=off || switch=on
[[email protected] ~]# echo $switch
on
[[email protected] ~]# unset switch
[[email protected] ~]# echo $tables

[[email protected] ~]# echo $switch

[[email protected] ~]# [[ $tables == 0 ]] && switch=off || switch=on
[[email protected] ~]# echo $switch
on
[[email protected] ~]#


bash shell只能做整数比较,浮点数无法使用数值比较,但好在可以使用字符比较进行弥补,字符的比较是没有误差的

[[email protected] ~]# [[ 11.11 -eq 11.22 ]] && echo wrong || echo right
-bash: [[: 11.11: syntax error: invalid arithmetic operator (error token is ".11")
right
[[email protected] ~]# [[ 11.11 == 11.22 ]] && echo wrong || echo right
right
[[email protected] ~]# [[ 11.11 == 11.12 ]] && echo wrong || echo right
right
[[email protected] ~]# [[ 10.10 == 10.01 ]] && echo wrong || echo right
right
[[email protected] ~]#



仔细阅读本文内容并按上述代码亲自测试一轮的朋友,相信你对bash shell弱类型又有了更进一步的认识了吧!理解了什么是弱类型语言特性,以及bash shell数值比较与字符比较的区别。

以上是关于bash shell数值比较(-eq)与字符比较(==)的区别的主要内容,如果未能解决你的问题,请参考以下文章

Shell中字符串数值的比较

Shell中字符串数值的比较

在bash shell 上如何按字母顺序比较两个字符串 ?

shell脚本基础

shell 中 if test 使用

shell 中 if test 使用