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

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

Re: [shell-script] Contador em while


From: Tiago Barcellos Peczenyj
Subject: Re: [shell-script] Contador em while
Date: Wed, 12 Sep 2007 13:47:13 -0300

Henrique

Parabens, vc acaba de descobrir o conceito de subshell!

quando vc faz:

cat arquivo | alguma_coisa

O 'alguma coisa' sera executado em um shell 'filho', ou seja, em outra
instância.
E outra instância de shell pode, no máximo, ver as variaveis do(s)
shell(s) pai(s), porém ele vê via cópia, não recebe uma referência.

Por isso vc nunca terá o seu PATH zoado por um script, pois mesmo que ele
altere o PATH, as alterações só serão sentidas no subshell que o script esta
rodando -- se vc deseja que isso aconteça, use o comando source.

Voltando ao seu problema: como resolver?

Quando vc usa um Pipe '|' vc conecta a saída padrão de um processo na
entrada padrão de outro. Para que vc visualize o valor da variavel que vc
deseja, o while tem que ser executado no shell corrente, algo como:

alguma coisa | cat arquivo

Entretanto o pipe funciona da esquerda pra direita. para vc fazer o
redirecionamento corrento, vc pode usar o simbolo <

alguma coisa < cat arquivo

Ops, mas o < só funciona quando tem um arquivo à sua direita. Então fica bem
mais simples:

alguma coisa < arquivo

OU

alguma coisa < <(cat arquivo)

onde <() é uma substituição de processo que onde o resultado do cat arquivo
é tratado como um arquivo (na verdade um named pipe)

Logo, faça

while ... ; done < arquivo

O livro 'Mastering UNIX Shell Scripting' mostra 12 formas de ler um arquivo
linha a linha e comenta as vantagens e desvantagens de cada forma, bem como
uma comparação em termos de velocidade (esta é uma das mais rápidas, senão a
mais rapida). Eu devo começar a catalogar as formas mais comuns de fazer
algumas coisas em shell script (bem como a compatibilidade com varios shells
e sistemas operacionais) no meu blog (assim que der tempo).

http://peczenyj.blogspot.com/search/label/Shell

E, é claro, visite sempre a pagina do Julio Neves (ex: tudo o que eu
expliquei estava dito aqui :
http://twiki.softwarelivre.org/bin/view/TWikiBar/TWikiBarPapo007#Vamos_ler_arquivos
-- porém agora que eu escrevi tudo...)

[]´s Tiago

On 9/12/07, Henrique Bueno <address@hidden> wrote:
>
> Olá Lista!
> Estou até com vergonha em fazer essa pergunta, mas eu ainda não
> consegui entender o que estou fazendo de errado.
> Olhe esse script:
> ##################################
> #!/bin/sh
> count=0
> cat lista.txt |
> while read LINHA
> do
> count=$((count+1))
> echo $count
> done
> echo TOTAL=$count
> ##################################
>
> Alguém poderia me explicar por que quando termina o while e eu mando
> mostrar a variável $count, ela está zerada?!
>
> O que eu preciso fazer para usar a variável $count após o while?!
>
> Grato!
>
> --
> Henrique Bueno
> linux user #417797
> ---------------------------------------------------------
> http://www.kibibit.com.br
> http://www.hbueno.eti.br
> 
>



-- 
Tiago B Peczenyj
Linux User #405772

http://peczenyj.blogspot.com/


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



reply via email to

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