我正在 bash 中测试一些东西,我决定将文件中的行数与唯一行数进行比较。我确实知道我可以简单地创建 2 个临时变量来存储相应的值并进行比较,但我想知道如何在 1 行中完成它。
例如,我认为这种方法可行:test `wc -l filename` -eq `uniq filename|wc -l`
。我收到错误-bash: test: too many arguments
。我的错误在哪里?如果不使用临时变量,您将如何解决?
答案1
您无法进行直接比较,因为wc -l file
输出[number] file
和uniq 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 个参数test
:19
、file
和-eq
。17
如果你尝试我建议的方法,你就会得到一个有 3 个参数的适当比较test
:
$ echo test "$(wc -l file|awk '{print $1}')" -eq "$(uniq file|wc -l)"
test 19 -eq 17