我想使用shell比较两个变量。
$a="abc pqr mno xyz"
$b="mno pqr xyz abc"
这里两个变量值相同(只是变量内的单词顺序不一样)。如果我比较$a
和$b
,它会说$a
和$b
不相同,但我希望shell命令进行比较,并说两个内容都相同。
答案 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
此问题仅标记为shell
。但是,如果shell是bash,那么可以在不使用sed的情况下定义sorted
函数,如下所示:
sorted() { echo "${1// /$'\n'}" | sort; }
此函数与前一个函数略有不同,因为只允许空格而不是制表符或其他空格作为单词分隔符,并且多个空格不会合并为一个分词符。