Comparando a saída de 2 comandos usando teste sem variáveis ​​temporárias

Comparando a saída de 2 comandos usando teste sem variáveis ​​temporárias

Estou testando algumas coisas no bash e decidi comparar o número de linhas no arquivo com o número de linhas exclusivas. Eu sei que posso simplesmente criar 2 variáveis ​​temporárias que armazenam os valores correspondentes e apenas compará-los, mas queria saber como fazer isso em uma linha.

Por exemplo, pensei que esta abordagem funcionaria: test `wc -l filename` -eq `uniq filename|wc -l`. Eu recebo o erro -bash: test: too many arguments. Onde está o meu erro e como você faria isso sem usar variáveis ​​temporárias?

Responder1

Você não pode fazer uma comparação direta porque apenas wc -l fileresultados [number] filee resultados . Você pode fazer como sugerido pelo @stelldriver, redirecionando o arquivo para a entrada padrão de , para que only seja gerado, ou usar awk para obter apenas o primeiro campo (veja abaixo).uniq file | wc -l[number]wcwc -l < file[number]

Além disso, os crases são ruins para a legibilidade. Prefira a $(command)construção.

Você recebe "muitos argumentos" porque suas expressões não estão entre aspas, então o shell divide a [number] filesaída em duas palavras em vez de apenas uma.

Resumindo, é isso que você procura:

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

Passamos wc -l filea saída para o awk para obter apenas o primeiro campo, o [number].


Apenas para maior clareza na resposta, veja o que acontece com sua tentativa original acrescentando um echoao comando:

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

Como pode ser visto, existem 4 argumentos para o testcomando: 19, file, -eqe 17.

Se você tentar o que proponho, obterá uma comparação adequada com 3 argumentos para test:

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

informação relacionada