Bash字符串比较

时间:2015-06-15 08:46:38

标签: string bash comparison

我正在尝试比较bash脚本中的两个字符串,我的结果非常奇怪。

[[ < ]]

阅读文档似乎[ \< ][[ < ]]应该是一样的,但他们不会这样做。当字符串不具有相同的长度时,似乎OK工作错误。我错过了什么吗?

编辑: 预期结果是4 x OK Wrong OK OK。经过测试:

  • CentOS版本6.4(最终版) - GNU bash版本4.1.2(1)-release(x86_64-redhat-linux-gnu)(OK Wrong OK OK
  • Ubuntu 14.04.2 LTS - GNU bash,版本4.3.11(1)-release(x86_64-pc-linux-gnu)(OK OK OK OK
  • openSUSE 13.1(Bottle)(x86_64) - GNU bash,版本4.2.53(1)-release(x86_64-suse-linux-gnu)({{1}})

3 个答案:

答案 0 :(得分:1)

以下是help test的文档:

  

STRING1&gt; STRING2

     

如果STRING1按字典顺序在STRING2之后排序,则为真。

以您的第一个if语句为例:

if [[ "010" < "01." ]]; then echo "Wrong"; else echo "OK"; fi

在Bash中,字符串"01."按字典顺序排序字符串"010"(您可以在Microsoft Excel等其他工具中测试),因此比较返回false。所有4个比较都是这种情况。

请注意,在0的末尾添加额外的"01."不会更改与"010"的排序,因此您仍会获得相同的结果。

答案 1 :(得分:0)

原因可能是从bash 4.1开始&lt;和&gt;字符串比较运算符尊重语言环境。

因此,在两个系统之间,您可以有以下不同之处:

  1. 不同的区域设置 - 通过运行locale进行检查(有关不同区域设置的含义,请参阅https://unix.stackexchange.com/a/87763/122478
  2. 即使区域设置相同,也可以打开shopat compat31或compat32(bash 3.1或3.2兼容模式),这意味着字符串比较不会考虑区域设置 - 通过运行shopt

    进一步阅读:

答案 2 :(得分:-1)

如果你要比较整数,你应该这样做:

如果[[10] 1]];然后回声“10&lt; 1”;否则回声“10&gt; 1”; fi 10> 1

如果你想比较浮点数,你应该看一下这个帖子: How to do float comparison in Bash?

对于你的例子:

echo“10&lt; 1.0”| bc 返回:0

echo“10&gt; 1.0”| bc retunr:1