比较两个变量时忽略词序

Disregard word order when comparing two variables

我想使用 shell 比较两个变量。

$a="abc pqr mno xyz"

$b="mno pqr xyz abc"

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

让我们定义变量:

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

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

sorted() {  echo "" | 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 总是 returns 为真,下面的也有效:

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

排序和 bash

这个问题的标签很简单shell。但是,如果 shell 是 bash,则可以不使用 sed 定义一个 sorted 函数,如下所示:

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

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