【发布时间】:2015-08-30 16:41:05
【问题描述】:
我正在尝试比较 Bash 脚本中的两个字符串,但得到了非常奇怪的结果。
if [[ "010" < "01." ]]; then echo "Wrong"; else echo "OK"; fi
if [[ "010" < "01.0" ]]; then echo "Wrong"; else echo "OK"; fi
if [ "010" \< "01." ]; then echo "Wrong"; else echo "OK"; fi
if [ "010" \< "01.0" ]; then echo "Wrong"; else echo "OK"; fi
阅读文档,[[ < ]] 和 [ \< ] 似乎应该工作相同,但他们没有。当字符串长度不同时,[[ < ]] 似乎工作错误。我错过了什么吗?
预期结果是 4 x OK。测试日期:
- CentOS 版本 6.4(最终版)- GNU Bash,版本 4.1.2(1)-release (x86_64-redhat-linux-gnu) (
OK Wrong OK OK) -
Ubuntu 14.04.2 (Trusty Tahr) LTS - GNU Bash,版本 4.3.11(1)-release (x86_64-pc-linux-gnu) (
OK Wrong OK OK) - openSUSE 13.1 (Bottle) (x86_64) - GNU Bash,版本 4.2.53(1)-release (x86_64-suse-linux-gnu) (
OK OK OK OK)
【问题讨论】:
-
能否请您添加脚本的输出?
-
第二个在
GNU bash, version 4.3.39上对我说错了。 -
我确认了奇怪的行为:输出说:“好的,错误的,好的,好的”;而对我来说,预期的输出是“好的,错误的,好的,错误的”;因为这些值在我的电脑上按“01”、“010”、“01.0”排序。
-
请注意,奇怪的行为只发生在极限情况排序;使用单括号和双括号时似乎使用了不同的排序算法;这可能吗?
-
查看 ASCII 表。出现在 0 之前,因此字符串的预期顺序应该是 01., 01.0, 010
标签: string bash comparison