shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Resgatendo valor de uma variável em um loop while


From: Julio C. Neves
Subject: Re: [shell-script] Resgatendo valor de uma variável em um loop while
Date: Tue, 1 Mar 2011 11:26:33 -0300

Fala Rudson,
esse é um erro comum. O que ocorre é que o pipe cria um subshell para
interpretar o while e neste ambiente a variável $LIST é incrementada, mas
qdo o while termia, essa subshell morre e a variável morre junto.

A saída para isso é redirecionar a entrada primária com um menor que (<),
porém esse redirecionamento sá pode ser feito de um arquivo e o que vc tem é
uma instrução (find) a saída então é usar uma substituição de processos, que
executa a instrução como se fosse um arquivo.

Dessa forma, seu script ficaria assim:

LIST=""
while read F; do
 if xz -t $F 2>/dev/null; then
echo "[Ok] - $F";
else
echo -e "\e[31;1m[Error] $F\e[m"; LIST="$LIST\n$F";
fi;
done < <(find xap/. -name *.txz)
echo -e "List of Erros: $LIST"

Para entender bem esse conceito, que é fundamental para desenv. scripts,
leia o que escrevi aqui no
botequim<http://wiki.softwarelivre.org/TWikiBar/TWikiBarPapo011#Named_Pipes>.
Lá tem, por coincidência, um script muito semelhante ao seu, inclusive pq a
variável usada tb é $LIST. Leia desde esse link até o fim da página.

Abraços,

Julio

*Cursos de Shell ou Zenity em fins de semana?*

*☎ Ligue (21) 8112-9988* ☎


Em 1 de março de 2011 09:28, Rudson <address@hidden> escreveu:

>
>
> Olá pessoal,
>
> Fiz um loop para verificar os arquivos xz com defeito em alguns
> sub-diretórios.
>
> O loop:
>
> LIST=""; find xap/. -name *.txz | while read F; do if xz -t $F 2>/dev/null;
> then echo "[Ok] - $F"; else echo -e "\e[31;1m[Error] $F\e[m";
> LIST="$LIST\n$F"; fi; done; echo -e "List of Erros: $LIST"
>
> O loop em si funcionou muito bem, mas tive um retorno o qual não
> compreendi, da variável LIST.
>
> A meu ver, esta variável deveria conter os nomes dos arquivos com erro na
> compactação, ao final do loop. Verifiquei com o debug de linha de comando
> (set -x) e vi que a variável LIST estava sendo preenchida adequadamente, mas
> ao final do loop, seu valor é perdido, retornando uma string vazia.
>
> ...
> + echo -e '\e[31;1m[Error] xap/./blackbox-0.70.1-x86_64-4.txz\e[m'
> [Error] xap/./blackbox-0.70.1-x86_64-4.txz
> + LIST='\nxap/./blackbox-0.70.1-x86_64-4.txz'
> ...
> + echo -e '\e[31;1m[Error] xap/./sane-1.0.22-x86_64-1.txz\e[m'
> [Error] xap/./sane-1.0.22-x86_64-1.txz
> +
> LIST='\nxap/./blackbox-0.70.1-x86_64-4.txz\nxap/./sane-1.0.22-x86_64-1.txz'
> + read F
> ...
> + read F
> + echo -e 'List of Erros: '
> List of Erros:
>
> Como pode ser visto acima, a variável é preenchida adequadamente, mas no
> echo final ela parece desaparecer. Verifiquei com um echo após a execução e
> a variável está mesmo vazia. Me parece algum problema de escopo de variável
> ou no meu bash, realmente não sei.
>
> Aqui, segue a linha aberta para ficar mais claro:
>
> LIST=""
> find xap/. -name *.txz | while read F; do
> if xz -t $F 2>/dev/null; then
> echo "[Ok] - $F";
> else
> echo -e "\e[31;1m[Error] $F\e[m"; LIST="$LIST\n$F";
> fi;
> done;
> echo -e "List of Erros: $LIST"
>
> Alguém poderia explicar isto?
>
>  
>


[As partes desta mensagem que não continham texto foram removidas]



reply via email to

[Prev in Thread] Current Thread [Next in Thread]