Com base na resposta do jordanm:
1. Canalize todos os dados por meio de uma única instância de wc -l
if [ "$#" -gt 0 ]
then
cat -- "$@" | wc -l
else
echo 0
fi
ou%
cat -- /dev/null "$@" | wc -l
- Use
-- "$@"
para proteger contra nomes de arquivos que começam com -
.
- Evite invocar
cat
sem argumentos
como isso fará com que leia a entrada padrão.
- Observe que
cat a_single_file | something
é a forma clássica do temido Uso inútil do gato ,
mas cat one_or_more_file(s) | something
pode ser OK (embora ainda não seja o ideal).
2. Confie no fato de que wc
emite uma linha “total”
if [ "$#" -gt 0 ]
then
wc -l -- /dev/null "$@" | tail -1
else
echo 0 total
fi
ou%
wc -l -- /dev/null /dev/null "$@" | tail -1
- Observe que
wc
emite uma linha total
somente se tiver pelo menos dois argumentos de nome de arquivo.
3. Use awk
sem usar wc
if [ "$#" -gt 0 ]
then
awk 'END {print NR}' -- "$@"
else
echo 0
fi
ou%
awk 'END {print NR}' -- /dev/null "$@"
Aviso:
Os comandos acima não produzirão todos a mesma resposta
se algum dos arquivos terminar com um caractere diferente de nova linha.