【问题标题】:Disregard word order when comparing two variables比较两个变量时忽略词序
【发布时间】:2015-06-08 05:28:55
【问题描述】:

我想用 shell 比较两个变量。

$a="abc pqr mno xyz"

$b="mno pqr xyz abc"

这里两个变量值相同(只是变量内部的单词顺序不同)。如果我比较 $a$b 它会说 $a$b 不一样,但我希望 shell 命令比较并说两个内容相同。

【问题讨论】:

    标签: shell unix sh


    【解决方案1】:

    让我们定义我们的变量:

    a="abc pqr mno xyz"
    b="mno pqr xyz abc"
    

    现在让我们定义一个按字母顺序排列单词的辅助函数:

    sorted() {  echo "$1" | sed 's/[[:space:]][[:space:]]*/\n/g' | sort; }
    

    现在,使用我们的辅助函数,让我们测试是否相等:

    [ "$(sorted "$a")" = "$(sorted "$b")" ] && echo Equal
    Equal
    

    不等字符串示例

    $ a="abc pqr mno xyz mmm"
    $ b="mno pqr xyz abc"
    $ [ "$(sorted "$a")" = "$(sorted "$b")" ] && echo Equal
    $
    

    作为sorted 所做的一个例子,让我们单独看看它的输出:

    $ a="abc pqr mno xyz mmm"
    $ sorted "$a"
    abc
    mmm
    mno
    pqr
    xyz
    

    如上所示,sorted 将所有单词按字母顺序排列。

    在两种情况下都显示一条消息

    如果字符串不相等,下面也会显示Not Equal

    if [ "$(sorted "$a")" = "$(sorted "$b")" ]; then echo Equal; else echo Not Equal; fi
    

    或者,在多行中:

    if [ "$(sorted "$a")" = "$(sorted "$b")" ]
    then 
        echo Equal
    else
        echo Not Equal
    fi
    

    因为echo 总是返回true,所以以下也可以:

    [ "$(sorted "$a")" = "$(sorted "$b")" ] && echo Equal || echo Not Equal
    

    排序和bash

    这个问题被简单地标记为shell。但是,如果 shell 是 bash,则可以在不使用 sed 的情况下定义 sorted 函数,如下所示:

    sorted() {  echo "${1// /$'\n'}" | sort; }
    

    此功能与上一个功能略有不同,它只允许使用空格,而不是制表符或其他空格作为单词分隔符,并且多个空格不会合并为一个分词符。

    【讨论】:

    • 感谢您的帮助,但如果我设置 a="abc pqr mno xyz mmm" 并使用您的命令与 $b 进行比较,它仍然显示 Equal。应该不相等吧?
    • @MAHADEVASWAMYHN 他们为我比较 不平等。我将该字符串的测试结果复制并粘贴到答案的末尾。你的屏幕有什么不同吗?
    • 这相当优雅,但不是很笼统。如果字符串包含 shell 元字符,则使用不带引号的字符串(这是printf 完成工作所必需的)可能会导致问题。
    • @John1024:感谢您的回复。在我的情况下,任何一个变量都可能有额外的单词或相同的单词。如果 $a 和 $b 相同,它应该回显“Equal”,否则如果任何一个变量具有任何额外字符,它应该说“Not Equal”。我该怎么做?
    • @MAHADEVASWAMYHN 我添加了打印代码Not Equal。我还更正了 sorted 函数中的一个错字:如果这是给您带来困难的原因,我深表歉意。
    猜你喜欢
    • 2010-12-23
    • 2012-05-29
    • 1970-01-01
    • 2013-03-21
    • 2011-10-25
    • 2018-07-28
    • 2012-02-18
    • 2016-12-15
    • 1970-01-01
    相关资源
    最近更新 更多