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: rudsonalves
Subject: Re: [shell-script] Resgatendo valor de uma variável em um loop while
Date: Sat, 05 Mar 2011 08:48:47 -0300
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101209 Thunderbird/3.1.7

Olá Júlio,

Valeu o esclarecimento. Imaginei que fosse algo assim.

A propósito o link para o botequim não está funcionando.

[[]]'s

> 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 
> <mailto:rudsonalves%40yahoo.com.br>> 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]
>
> 



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



reply via email to

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