Muito novo no Bash e bastante confuso sobre variáveis/subshells locais/globais. Não sei por que as variáveis modificadas não serão impressas no final da função - estou tentando imprimir uma contagem final de linha e contagem de arquivo no final do arquivo, mas se eu fizer isso, ele apenas imprime out 0 porque são variáveis locais. Existe alguma maneira de imprimir os valores modificados?
count=0
files=0
find . -type f | while IFC= read -r file;
do
let files=files+1
wc -l $file
count=$(($count+$(wc -l < $file)))
echo "total lines $count ; total files $files"
done
echo $files $count
exit 0
Sim. Mas é absolutamente não intuitivo. Isso funcionará, por exemplo:
A
<(command)
construção é chamada de "substituição de processo" e permite tratar a saída de um comando como um "arquivo". Alimentá-lo no loop dessa maneira faz com que seu script funcione conforme o esperado.O problema é o uso do pipe (
|
) que faz com que o loop while seja executado em um subshell separado que não pode modificar variáveis fora dele.Em shells que não suportam o
<()
recurso, você pode executar o(s) comando(s) à direita do pipe em uma subvenda e incluir o eco final nesse subshell: