Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvida em script: Lendo linha a linha e somando

Olá, alguem poderia me dizer porque o código A (abaixo) funciona e o código B não?

Código A

i=0
cat /etc/passwd | while read line; do i=$((i+1)); done
echo $i

""A"" Imprime o número de linhas, que é o desejado (imprime 42 no meu caso).


Código B

i=0
cat /etc/passwd | while read L
do 
    i=$((i+1))
done
echo $i

""B"" Imprime 0, sempre.

2 respostas
solução!

Olá Rafael,

Esse comportamento ocorre porque o pipeline faz com que o comando read seja executado em um subshell, criando uma nova variável de contexto. Com isso o loop do while é executado em um novo contexto com a cópia da variável criada inicialmente 0, quando o loop é terminado a cópia é descartada assim como o subshell e a variável original do shell pai não foi alterada e é sempre 0.

Dessa forma, para evitar esse cenário podemos colocar todo o comando em uma linha para termos assim o redirect de uma saída de um comando para outro como você fez, se for necessário fazermos em linha separada, uma alternativa seria executar todo o bloco do while em um subshell:

i=0
cat /etc/passwd | 
{
while read L
do 
    i=$((i+1))
done
echo $i
}

Entendi o porquê. Mas gostaria de mais detalhes sobre esses "subshells", o que são, quando ocorrem, do que se alimentam, etc...rs