Cygwin - Shell Scripting (eval e echo)

1

Eu tenho o seguinte arquivo f1.txt:

A=0    
A=\'expr $A + 1\'

e o seguinte arquivo de script s1.sh

for line in $(cat testfile.txt)
do
   echo "$line"
   # eval $line
done
echo $A

Quando executo o script usando "sh s1.sh", recebo a seguinte saída:

A=0    
A='expr      
$A     
+    
1'      

Eu esperava que a saída do eco fosse:

"A='expr $A + 1'"
  1. Gostaria de saber por que o echo está colocando novas linhas entre as palavras?
  2. Além disso, quando descomenteço a linha eval , recebo o seguinte erro:

    s1.sh: eval: line 4: unexpected EOF while looking for matching '''     
    s1.sh: eval: line 5: syntax error: unexpected end of file
    

Eu gostaria de saber o que está errado.

    
por EggHead 19.01.2014 / 05:22

2 respostas

2
  1. O Echo está colocando novas linhas entre as palavras porque está dividindo a entrada nos espaços, não na nova linha.

  2. Também é por isso que o eval não funciona - ele vê a primeira palavra, contendo um ' , e não vê o final da linha, que contém o fechamento '

Solução:

Altere o valor do IFS (Internal Field Separator) para não conter espaços ou tabulações, mas apenas novas linhas. Você faz assim:

IFS=$'\n'

antes de começar a ler no arquivo.

    
por 19.01.2014 / 09:02
1

Não use for loops para isso. Por padrão, como explicado por @JennyD, seu shell irá se dividir em espaços em branco e não manter a linha inteira. Esse não é o caso se você read o arquivo em um loop while em vez de cat e for :

 $ while read line; do echo "$line"; done < f1.txt;
 A=0
 A='expr $A + 1'

Isso também fará com que o eval seja executado corretamente:

$ while read line; do eval "$line"; done < f1.txt; echo "A is $A"
A is 1

Então, por exemplo:

$ cat f1.txt 
A=5    
A=\'expr $A + 1\'
$ while read line; do eval "$line"; done < f1.txt; echo "A is $A"
A is 6
    
por 19.01.2014 / 15:53