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: Mon, 7 Mar 2011 12:52:09 -0300

A diferença Fabrício, eu expliquei no e-mail que mandei para o Rudson. No
script dele o while recebia os dados da entrada primária via um pipe. Como
pipes geram subshells, o while dele rodava em um shell filho, que qdo
terminava, morria levando para seu túmulo todos os dados criados ou
alterados no seu interior.

Se vc rodar um for debaixo de um pipe acontecerá o mesmo.

Abraços,

Julio

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

*☎ Ligue (21) 8112-9988* ☎
Contacte-me [image: Twitter] <http://twitter.com/#%21/juliobash/>


Em 7 de março de 2011 09:57, Fabricio Candido
<address@hidden>escreveu:

>
>
> Rudson, bom dia. !!!
>
> Fiz alguns testes em casa e realmente com export não funciona. Pelo
> exemplo que voce publicou na lista voce esta recebendo apenas um parametro:
> já pensou em usar for ao inves de while ? Estou sugerindo isto porque fiz
> um
> exemplo de laço com for e ele exportou o resultado. Segue exemplo que
> utilizei:
>
> #---------------------------------------------------
>
> export LIST=""
>
> for F in `last | head -10 | cut -f1 -d" "`
> do
> if [ "`echo $i | grep ^root`" ] ; then
> echo "Login root"
> else
> echo "Outro usuario: $F"
> export LIST="$LIST\n$F"
> fi
> export LIST
> done
>
> echo -en $LIST
>
> #---------------------------------------------------
>
> Só não sei te explicar a diferença...
>
> []s
>
> Fabricio Candido
>
> 2011/3/6 rudsonalves <address@hidden>
>
> >
> >
> > Está em meus bookmarks de shell Julio, valeu.
> >
> > Eu já havia tentado o export Fabricio, de pai para filho, mas não
> > funcionou. O filho recebe o valor mas não exporta, como o Júlio comentou.
> >
> > Valeu.
> >
> >
> > > Fala Rudson,
> > > é uma pena que vc não conseguiu acessar o link que passei, mas acabei
> > > de ver
> > > o cara que cuida da infra do site passar por aqui fantasiado de
> > > baiana... ;)
> > >
> > > Brincadeiras à parte, creio que ele não ficará fora por muito tempo,
> pois
> > > tem muito material importante lá. acho tb que vc deveria tentar
> novamente
> > > amanhã, pois o material que passei para vc ler é muito útil e quebra
> > > diversos galhos.
> > >
> > > Abraços,
> > >
> > > Julio
> > >
> > > *Cursos de Shell ou Zenity em fins de semana?*
> > >
> > > *☎ Ligue (21) 8112-9988* ☎
> > > [image: Twitter] <http://@juliobash>@juliobash
> > >
> > > Em 5 de março de 2011 08:48, rudsonalves <address@hidden
> > > <mailto:rudsonalves%40yahoo.com.br>>escreveu:
> > >
> > > >
> > > >
> > > > 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>
> > > > > <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]
> > > >
> > > >
> > > >
> > >
> > > [As partes desta mensagem que não continham texto foram removidas]
> > >
> > >
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
> >
> >
>
> [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]