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

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

Re: [shell-script] Escopo no bash


From: Thobias Salazar Trevisan
Subject: Re: [shell-script] Escopo no bash
Date: Thu, 4 Oct 2001 11:06:08 -0300 (BRT)

        Primeiro, o problema nao esta no while, e sim no pipe. O pipe
apenas pega a saida padrao do comando e conecta ela na entrada padrao do
segundo comando. Soh que o segundo comando e executado em um subshell...!!!
        Ou seja, no seu exemplo quando o while termina, tb termina o
subshell que estava executando o while, assim a variavel contador se
perde. Quando vc da um echo no total, ele vai imprimir o valor inicial, ou
seja, 0. Troque ele pra qualquer valor que vc vai ver.
        Um modo de solucionar este problema, e gerar um arq de saida
dentro do while, e apois isto vc le do arq. Vc tem que ter alguma coisa
onde vc possa compartilhar entre os subshell.

        T+,
Thobias.

-- 
Semper Fi, dude.

----
Thobias Salazar Trevisan <address@hidden>
Home Page - http://www.cos.ufrj.br/~thobias
Parallel Computing Laboratory / COPPE
Federal University of Rio de Janeiro
Brazil
__________________________
|                        |
| Against - HTML Mail    |
|                        |
--------------------------


On Thu, 4 Oct 2001, Horacio Fernandes wrote:

> Date: Thu, 04 Oct 2001 10:02:29 +0800
> From: Horacio Fernandes <address@hidden>
> Reply-To: address@hidden
> To: address@hidden
> Subject: [shell-script] Escopo no bash
>
> Olá pessoal,
>     Estou com uma dúvida simples no escopo de variáveis do bash.
>     Gostaria de saber como mandar valores via variáveis de dentro de um while 
> para
fora dele. Como exemplo eu criei o script simples abaixo:
>
> #!/bin/bash
>
> Contador=0
> who | while read Linha; do
>     echo ":: $Linha :: $Contador"
>     Contador=$[ $Contador + 1 ]
> done
> echo "Total: $Contador"
>
>     Eu queria que ele retornasse o número total de pessoas logadas, mas ele 
> não faz isso, retornando:
>
> :: root     tty1     Oct 10 06:23 :: 0
> :: root     tty2     Oct 10 06:23 :: 1
> :: root     tty3     Oct 10 06:26 :: 2
> :: root     tty4     Oct 10 06:26 :: 3
> :: root     tty5     Oct 10 06:26 :: 4
> Total: 0
>
>     Note como a variável realmente é incrementada dentro o while, mas quando 
> sai dele, perde-se o valor.
>     Sei que existem outros meios de se verificar quantas pessoas estão 
> logadas. O script acima é só um pequeno exemplo da minha dúvida.
>
>     Muito obrigado desde já.
> Horácio Fernandes
>


From (no email address) Thu Oct 04 07:15:46 2001
Return-Path: <address@hidden>
X-Sender: address@hidden
X-Apparently-To: address@hidden
Received: (EGP: mail-7_4_1); 4 Oct 2001 14:13:41 -0000
Received: (qmail 18059 invoked from network); 4 Oct 2001 14:13:40 -0000
Received: from unknown (10.1.10.27)
  by 10.1.1.224 with QMQP; 4 Oct 2001 14:13:40 -0000
Received: from unknown (HELO perninha.conectiva.com.br) (200.250.58.156)
  by mta2 with SMTP; 4 Oct 2001 14:15:36 -0000
Received: from burns.conectiva (burns.conectiva [10.0.0.4])
        by perninha.conectiva.com.br (Postfix) with SMTP id BC98039466
        for <address@hidden>; Thu,  4 Oct 2001 11:15:28 -0300 (EST)
Received: (qmail 16915 invoked by uid 0); 4 Oct 2001 14:13:23 -0000
Received: from verde.distro.conectiva (10.0.17.77)
  by burns.conectiva with SMTP; 4 Oct 2001 14:13:23 -0000
Date: Thu, 4 Oct 2001 11:16:28 -0300 (BRT)
X-X-Sender:  <verde@verde.distro.conectiva>
To: <address@hidden>
Cc: Horacio Fernandes <address@hidden>
Subject: Re: [shell-script] Escopo no bash
In-Reply-To: <Pine.LNX.4.33.0110041100280.1196-100000@localhost.localdomain>
Message-ID: <Pine.LNX.4.33L.0110041115390.889-100000@verde.distro.conectiva>
MIME-Version: 1.0
Content-Type: TEXT/PLAIN; charset=iso-8859-1
Content-Transfer-Encoding: 8BIT
X-eGroups-From: # aurelio marinho jargas <address@hidden>
From: # aurelio marinho jargas <address@hidden>

olás,

@ 4/10, Thobias Salazar Trevisan:
>       Primeiro, o problema nao esta no while, e sim no pipe. O pipe
> apenas pega a saida padrao do comando e conecta ela na entrada padrao do
> segundo comando. Soh que o segundo comando e executado em um subshell...!!!
>       Ou seja, no seu exemplo quando o while termina, tb termina o
> subshell que estava executando o while, assim a variavel contador se
> perde. Quando vc da um echo no total, ele vai imprimir o valor inicial, ou
> seja, 0. Troque ele pra qualquer valor que vc vai ver.
>       Um modo de solucionar este problema, e gerar um arq de saida
> dentro do while, e apois isto vc le do arq. Vc tem que ter alguma coisa
> onde vc possa compartilhar entre os subshell.

ou você elimina o pipe, gravando a saída do who num arquivo, e
este arquivo é a entrada padrão do while (lááá depois do done)

Contador=0
who > who.txt

while read Linha; do
    echo ":: $Linha :: $Contador"
    Contador=$[ $Contador + 1 ]
done < who.txt
echo "Total: $Contador"


-- 
s·:(·>(·×^a]×http://www.verde666.org×^[:wq



reply via email to

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