比较两个变量时忽略单词顺序

时间:2015-06-08 05:28:55

标签: shell unix sh

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

$a="abc pqr mno xyz"

$b="mno pqr xyz abc"

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

1 个答案:

答案 0 :(得分: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; }

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