【发布时间】:2015-06-08 05:28:55
【问题描述】:
我想用 shell 比较两个变量。
$a="abc pqr mno xyz"
$b="mno pqr xyz abc"
这里两个变量值相同(只是变量内部的单词顺序不同)。如果我比较 $a 和 $b 它会说 $a 和 $b 不一样,但我希望 shell 命令比较并说两个内容相同。
【问题讨论】:
我想用 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 "$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; }
此功能与上一个功能略有不同,它只允许使用空格,而不是制表符或其他空格作为单词分隔符,并且多个空格不会合并为一个分词符。
【讨论】:
printf 完成工作所必需的)可能会导致问题。
Not Equal。我还更正了 sorted 函数中的一个错字:如果这是给您带来困难的原因,我深表歉意。