我需要按字典顺序比较 bash 脚本中的字符串。问题是 bash 似乎完全忽略了“_”字符,就好像它们根本不存在一样。在 ascii 代码表中,“_”位于大写字母和小写字母之间,因此我假设 A-Z
1 $ if [[ "ab" < "a_" ]]; then echo 1; fi
2 $ if [[ "ab" < "a_a" ]]; then echo 1; fi
3 $ if [[ "ab" < "a_c" ]]; then echo 1; fi
1
4 $ if [[ "aZ" < "a_" ]]; then echo 1; fi
$
命令 #3 也应该为 false,因为 '_' 'Z'。
对我来说唯一合乎逻辑的解释是 Debian bash 中简单地省略了 '_' 字符,因此 "ab" false, "ab" false, "ab" true, "aZ" false 是真正被评估的内容。
Debian bash 中是否有任何方法可以比较这些字符串,按照 ascii 代码的建议对待它们的 '_' 字符?
Thanks
正如评论中指出的那样,[[ < ]]
运算符取决于您当前的区域设置。这也记录在bash 的手册 https://www.gnu.org/software/bash/manual/bash.html#Conditional-Constructs:
当与 [[ 一起使用时,“”运算符使用当前区域设置按字典顺序排序。
您可以使用以下命令检查当前区域设置locale
。当您在 Mac OS 和 Debian 上运行此命令时,您应该会得到不同的结果。
您可以使用以下命令覆盖脚本的系统区域设置export LC_ALL=...
。按 ascii 代码排序的语言环境是C
.
$ export LC_ALL=en_US.UTF-8; [[ ab < a_c ]]; echo $?
0
$ export LC_ALL=C; [[ ab < a_c ]]; echo $?
1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)