|
From: | Julio C. Neves |
Subject: | Re: [shell-script-pt] $((i)) ou $((i++)) no Dicas-L de 15/ago/2019 (Substituição de Processos) |
Date: | Sun, 14 Jun 2020 08:55:12 -0300 |
Olá Júlio !
No Dicas-L de 15/ago/2019 (Substituição de Processos - http://www.dicas-l.com.br/arquivo/substituicao_de_processos.php) vi um exemplo que não entendi:
ls arq* | while read Arq
do
echo $((i)) $Arq
done; echo Eu tenho :$i: arquivos
Com a saída esperada (supondo que os arquivos existam no diretório):
1 arq
2 arq.err
3 arq.err1
4 arq.limpo
Eu tenho :: arquivos
Mas quando tento da forma acima a variável i não é incrementada.
Não estaria faltando o '++' no ((i)) ?
ls arq* | while read Arq
do
echo $((i++)) $Arq #<-------
done; echo Eu tenho :$i: arquivos
(assim funciona)
Se vc fizer $((i++)), com os mesmos arquivos do exemplo sua saída seria:
0 arq1 arq.err2 arq.err13 arq.limpo
Ou seja, a origem seria zero e não 1 pq vc usou uma pós incrementação e o correto seria uma pré incrementação com um echo $((++1))
A última linha deveria ser:Eu tenho :4: arquivosE continua sendo:Eu tenho :: arquivosIsso ocorrerá por causa do pipe após o ls, que gerará um subshell para executar o while. Todo o valor de $i que foi alterado dentro desse subshell será perdido ao seu término e é aí que entra a substituição de processos para que isso não ocorra. Para tudo funcionar 100%, o script deveria ser:while read Arqdoecho $((++i)) $Arqdone < <(ls arq*); echo Eu tenho :$i: arquivos
Abraços,
Não conhecia nem essa construção (com dois parênteses e o ++, que exibe e incrementa ao mesmo tempo - muito prática!).
De qualquer maneira já aprendi algo novo e deve ser útil a muitos! :-)
Abraços de um fã. ;-)
Renato Romano, São B. Campo
[Prev in Thread] | Current Thread | [Next in Thread] |