Em geral, para fazer um loop sobre o argumento da linha de comando em um script ou função shell, você pode fazer
for thing do
commands using "$thing"
done
ou
for thing in "$@"; do
commands using "$thing"
done
Nesse caso, supondo que os nomes de arquivos fornecidos na linha de comando não contenham novas linhas literais, não é necessário fazer um loop de shell explícito para isso:
wc -l -- "$@" | sed -E '$d;s/^[[:blank:]]*([[:digit:]]*)[[:blank:]]*(.*)/ lines in /'
Isso levaria todos os argumentos da linha de comando e executaria wc -l
em todos eles.
A saída é analisada por sed
, que descarta a última linha contendo o número total de linhas nos arquivos fornecidos (usando $d
). O restante da saída de wc -l
é transformado na saída que você deseja, capturando o número de linhas e o nome do arquivo e, em seguida, inserindo a string lines in
no meio.
A execução do script com meus próprios arquivos .vimrc
, .profile
e .mailrc
retornará
8 lines in .vimrc
8 lines in .profile
4 lines in .mailrc
Observe que wc -l -- "$@"
criará resultados como
8 .vimrc
8 .profile
4 .mailrc
20 total
que pode realmente ser suficiente para o que você deseja, sem a necessidade de sed
.