Por que a expansão variável bash retém aspas?

12
> echo "hi"
hi
> VAR='echo "hi"'
> $VAR
"hi"

Por que a saída dos comandos acima é diferente?

Coisa semelhante ocorre com aspas simples:

> VAR="echo 'hi'"
> $VAR
> 'hi'
    
por Cory Klein 11.05.2012 / 19:04

3 respostas

16

O par extra de citações seria consumido apenas por uma etapa extra de avaliação. Por exemplo forçado por eval :

bash-4.2$ VAR='echo "hi"'

bash-4.2$ $VAR
"hi"

bash-4.2$ eval $VAR
hi

Mas geralmente é uma má idéia colocar comandos com parâmetros em uma string. Use uma matriz em vez disso:

bash-4.2$ VAR=(echo "hi")

bash-4.2$ "${VAR[@]}"
hi
    
por 11.05.2012 / 19:08
8

A remoção de cotações ocorre apenas nas palavras de entrada originais, não no resultado de expansões. As cotações que fazem parte das variáveis expandidas não são alteradas.

    
por 11.05.2012 / 19:12
2

Se você voltar um pouco, você pode ver porque a substituição de variáveis deve manter aspas.

O ponto de aspas em um shell Unix / Linux / BSD é manter partes de uma string juntas que, de outra forma, seriam analisadas como várias strings. Como por padrão um shell usa espaço em branco como um separador de tokens, uma string com espaços (como "um dois três") se não for citada ou escapada de alguma forma, seria analisada como 3 strings: "one", "two" e "three".

Se um programador quiser uma string com o valor de alguma variável interpolada:

VAR=two
STRING="one $VAR three"

o shell não deve absolutamente remover as aspas: a string contendo espaços seria analisada como 3 strings menores.

    
por 12.05.2012 / 01:05