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