【问题标题】:Comparing two strings containing '_' lexicographically in bash在bash中按字典顺序比较两个包含'_'的字符串
【发布时间】:2020-05-26 23:01:00
【问题描述】:

我需要按字典顺序比较 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 也应该为假,因为'_' 'Z'。

对我来说唯一合乎逻辑的解释是 '_' 字符在 Debian bash 中被简单地省略了,所以 "ab" false, "ab" false, "ab" true, "aZ" false 是真正被评估的。

在 Debian bash 中有什么方法可以比较这些字符串,将它们的 '_' 字符视为它们的 ascii 代码所建议的那样?

谢谢

【问题讨论】:

  • bash 没有省略任何内容,它与当前的语言环境有关

标签: bash


【解决方案1】:

正如 cmets 中所指出的,[[ &lt; ]] 运算符取决于您当前的语言环境。这也记录在bash's manual

当与 [[ 一起使用时,“”运算符使用当前语言环境按字典顺序排序。

您可以使用命令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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    相关资源
    最近更新 更多