Eu queria fazer um script rápido para contar o número de linhas que meus arquivos .scala têm:
#!/bin/bash
counter=0;
find -iname "*.scala" | while read f; do
lc=$(cat $f | wc -l);
counter=$((counter+lc));
echo "$lc $counter";
done
echo "final result: $counter";
Mas infelizmente isso imprime
20 20
204 224
212 436
final result: 0
O que está errado aqui?
Respostas:
3 para resposta № 1O problema é causado porque você usa um tubo antes do seu loop while.
Ao fazê-lo, bash
cria automaticamente um novo subshell. Todas as modificações que você fizer serão executadas no novo contexto e não serão propagadas quando o contexto for fechado.
Usar substituição de processo em vez de :
#!/bin/bash
counter=0;
while read f; do
lc=$(cat $f | wc -l);
counter=$((counter+lc));
echo "$lc $counter";
done < <(find -iname "*.scala")
echo "final result: $counter";