Erro de Eval no Shell

1

Estou criando e definindo uma variável no meu script de shell usando a seguinte expressão.

eval "test2"="'Test Name's Test'"

Mas resulta no seguinte erro

-sh: eval: line 1: syntax error: Unterminated quoted string

Como posso corrigir isso?

    
por Poorna 06.01.2012 / 07:01

3 respostas

3

Para ter uma ideia do que realmente será executado quando eval -ing alguma string, tente echo it first . eval -ing é como copiar a saída de echo para o shell e rodar esse :

echo "test2"="'Test Name's Test'"
test2='Test Name's Test'

Existem três citações simples, que nunca serão executadas. E como você não pode incluir aspas simples em strings com aspas simples do Bash (ele nem suporta a contrabarra de escape, ao contrário de muitas outras linguagens), você terá que usar aspas duplas se quiser eval algo assim:

echo "test2"="\"Test Name's Test\""
test2="Test Name's Test"

Mas como @daniel apontou, o eval é desnecessário. E você não deveria estar usando eval em qualquer caso - O único caso que eu já vi de útil eval é com getopt output .

    
por 06.01.2012 / 08:52
0

A mensagem de erro é bem clara aqui. Citação não terminada provavelmente está se referindo às três aspas simples do lado direito.

    
por 06.01.2012 / 08:04
0

Primeiro: por que o eval ? Você poderia apenas dizer test="..." .

Segundo: você não pode colocar uma única cota ' em uma cadeia delimitada por aspas simples. Você não pode nem escapar com uma barra invertida. Então, para colocar uma única citação em uma string, você tem que terminar a string entre aspas simples e inserir a aspa simples (que deve ser escapada):

test2='Test Name'"'"'s Test'; echo $test2
test3='Test Name'\''s Test'; echo $test3

O problema com eval é que ele adiciona outra rodada de expansão, então você tem que escapar do " 's interno

eval test2="'Test Name'\"'\"'s Test'"; echo $test2
eval test3="'Test Name'\''s Test'"; echo $test3
    
por 06.01.2012 / 08:49

Tags