[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [shell-script] variável some
From: |
Eliphas Levy Theodoro |
Subject: |
Re: [shell-script] variável some |
Date: |
Tue, 12 Jul 2005 15:24:35 -0300 |
User-agent: |
Mozilla Thunderbird 1.0.2 (Windows/20050317) |
Claudio Sá de Abreu escreveu:
[...]
O problema é o seguinte: O último "echo $_cont", que está fora do while,
imprime o valor "10", ou seja, é como se a variável _cont dentro do
while estivesse "protegida".
[...]
Já usei export $_cont dentro do while, mas não adiantou. Alguém sabe
como faço para as modificações de dentro do while irem para fora?
Essa não é nova. Quando você usa um pipe para redirecionar para outro
comando, você na verdade está abrindo uma nova instância do shell, e
essa nova instância não compartilha *para escrita* as variáveis de
ambiente do shell superior.
$ cat y
um
dois
tres
$ cat x
#!/bin/bash
c=0
cat y | while read line; do let c++; echo -n "$c "; done; echo $c
while read line; do let c++; echo -n "$c "; done < y; echo $c
$ ./x
1 2 3 0
1 2 3 3
O segundo while é parte do mesmo shell que criou a variável, o primeiro
é uma "cópia". Assim que ele acaba (no done), tudo que está dentro dele
faz *puf*.
Por isso que o segundo não altera as variáveis do primeiro.
Você pode usar redirecionamentos, como eu fiz no exemplo, ou se não é
simplesmente um arquivo que vai ser redirecionado, mas a saída de outro
comando, outros xunxos como named pipes ou substituição de processos:
http://www.tldp.org/LDP/abs/html/contributed-scripts.html#FIFO
named pipe:
$ mkfifo pipe
$ sed 's/foo/bar/' arquivo > pipe &
$ while read line; do ...; done < pipe
$ rm pipe
http://www.tldp.org/LDP/abs/html/process-sub.html
process substitution:
$ while read line; do ...; done < <(sed 's/foo/bar/' arquivo)
--
Eliphas