Por que as linhas novinhas atrapalham a condição while?

4

Eu tenho um loop while que permite a configuração de variáveis quando escritas de uma maneira, mas não a permitem quando gravadas de outra maneira. Por que é que? Isto imprime var como 1234 e não imprime var2

#!/bin/bash

var=1234

while var=9876 var2=765 read line
do

    echo $var $var2
    echo $line

done <datafile

echo out of loop $var

Isto imprime var como 9876 e também imprime var2

#!/bin/bash

var=1234

while 
var=9876 
var2=765 
read line
do

    echo $var $var2
    echo $line

done <datafile

echo out of loop $var
    
por abc 30.08.2011 / 17:31

2 respostas

5

No seu segundo exemplo, colocando var e var2 em linhas separadas, isso faz com que o comando seja o mesmo que

while var=9876; var2=765; read line

O comando while permite uma lista de comandos antes de executar os comandos no loop do-while. help while mostra isso:

while: enquanto COMMANDS; fazer comandos; feito
Executar comandos contanto que um teste seja bem-sucedido.
Expanda e execute COMMANDS enquanto o comando final estiver no 'while' COMMANDS tem um status de saída de zero.
Status de saída: retorna o status do último comando executado.

Por outro lado, quando uma atribuição de variável precede um comando (neste caso read ), e essa atribuição é seguida apenas por espaços em branco, o escopo dessa variável é localmente para o comando SOMENTE! (internamente) ...

Veja: In 'while IFS = read .. ', por que o IFS não tem efeito?

    
por 30.08.2011 / 18:13
1

Eu não sabia que o bash poderia fazer essas coisas, então obrigado por publicá-las.

Aqui está minha explicação.

Esta linha no seu primeiro script:

while var=9876 var2=765 read line 

na verdade define uma variável de ambiente chamada "var" para o valor "9876" e define outra variável de ambiente chamada "var2" para o valor "765" , mas apenas para o comando read line . É um "recurso" da velha escola estranha. É por isso que a linha echo $var $var2 apenas imprime "1234" - a variável de ambiente chamada "var" aplica-se apenas a read line .

O segundo script, onde as atribuições de variáveis e o read line aparecem em linhas diferentes, eu acho que atribui variáveis de shell chamadas "var" e "var2" toda vez através do loop.

    
por 30.08.2011 / 18:22