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 .