使用不带临时变量的测试比较两个命令的输出

使用不带临时变量的测试比较两个命令的输出

我正在 bash 中测试一些东西,我决定将文件中的行数与唯一行数进行比较。我确实知道我可以简单地创建 2 个临时变量来存储相应的值并进行比较,但我想知道如何在 1 行中完成它。

例如,我认为这种方法可行:test `wc -l filename` -eq `uniq filename|wc -l`。我收到错误-bash: test: too many arguments。我的错误在哪里?如果不使用临时变量,您将如何解决?

答案1

您无法进行直接比较,因为wc -l file输出[number] fileuniq file | wc -l仅输出[number]。您可以按照@stelldriver 的建议,使用将文件重定向到wc的标准输入wc -l < file,以便仅[number]输出,或者使用 awk 仅获取第一个字段(见下文)。

另外,反引号不利于阅读。更喜欢这种$(command)结构。

您得到“太多参数”是因为您的表达式没有被引用,所以 shell 将输出分成[number] file两个词而不是一个词。

总而言之,这就是你所追求的:

test "$(wc -l file|awk '{print $1}')" -eq "$(uniq file|wc -l)"

我们将wc -l file输出传递给 awk 以便仅获取第一个字段[number]


为了更清楚地回答这个问题,请在echo命令前面加上一个,看看您最初的尝试会发生什么:

$ echo test `wc -l file` -eq `uniq file|wc -l`
test 19 file -eq 17

可以看出,该命令有 4 个参数test19file-eq17

如果你尝试我建议的方法,你就会得到一个有 3 个参数的适当比较test

$ echo test "$(wc -l file|awk '{print $1}')" -eq "$(uniq file|wc -l)"
test 19 -eq 17

相关内容