Preciso de aspas duplas de uma variável?

0

Estou confuso quando damos aspas duplas nas variáveis do shell.
Especificamente, estou usando o seguinte comando sed replace:

sed -i.tmp "/$MY_VAR/d" /foo/bar/file.txt  

Mas não estou citando $MY_VAR . Isso está correto? Como posso citar, se não?
O seguinte obviamente não funciona

sed -i.tmp '/"$MY_VAR"/d' /foo/bar/file.txt  
    
por Jim 20.10.2017 / 16:29

1 resposta

3

No seu primeiro comando, você está citando a variável.

A string passada como o segundo argumento de linha de comando para sed tem aspas duplas em torno dele, e a variável está dentro dessas citações e será expandida pelo shell.

O segundo comando não funcionará (como esperado), como você apontou, porque o shell não expande o valor da variável, uma vez que é citado usando aspas simples. Ainda vai fazer alguma coisa embora. Ele excluirá qualquer linha de entrada contendo a string literal "$MY_VAR" (incluindo as aspas).

O primeiro comando está correto, mas você terá problemas se $MY_VAR contiver barras. Em caso afirmativo, escolha um delimitador para o padrão sed que não ocorre em $MY_VAR :

sed "\@$MY_VAR@d"

Uma variável é citada quando aparece entre aspas. A variável não precisa ser "bem citada" para ser citada . Ou seja, dentro da string "hello $world!" , a variável $world é citada mesmo que não apareça como "$world" .

O que importa é que a string como um todo seja citada. Se forem usadas aspas duplas, o shell expandirá quaisquer variáveis dentro dele.

No exemplo acima, a string "\@$MY_VAR@d" é citada, e a variável $MY_VAR está dentro dela, assim também é citada (já que está dentro da string citada).

    
por 20.10.2017 / 16:34