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: Fabricio Candido
Subject: Re: [shell-script] Resgatendo valor de uma variável em um loop while
Date: Mon, 7 Mar 2011 09:57:20 -0300

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]



reply via email to

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