Сравнение вывода двух команд с использованием теста без временных переменных

Сравнение вывода двух команд с использованием теста без временных переменных

Я тестирую несколько вещей в 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)конструкцию.

Вы получаете «слишком много аргументов», поскольку ваши выражения не заключены в кавычки, поэтому оболочка разбивает [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

Как видно, у testкоманды есть 4 аргумента: 19, file, -eqи 17.

Если вы попробуете то, что я предлагаю, вы получите правильное сравнение с тремя аргументами в пользу test:

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

Связанный контент