比较两个变量时忽略词序
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; }
此功能与前一个功能略有不同,因为仅允许空格而不是制表符或其他空格作为单词分隔符,并且多个空格不会合并为一个单词分隔符。
我想使用 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; }
此功能与前一个功能略有不同,因为仅允许空格而不是制表符或其他空格作为单词分隔符,并且多个空格不会合并为一个单词分隔符。