Diferença entre 'e' na linha de comando (bash)?

7

Eu usei '' e "" (aspas simples e duplas) na linha de comando, mas recentemente notei que '$HOME/some/dir' não é expandido, enquanto "$HOME/some/dir" é. Pesquisei um pouco e descobri que "" permite alguma proteção de caracteres especiais, enquanto '' permite proteção total. Então, quais outros personagens são protegidos por '' e não "" ?

EDIT: Quais são as situações práticas nas quais essas diferenças podem ser significativas?

    
por apoorv020 17.02.2011 / 15:25

2 respostas

12

Dê uma olhada na página man bash. Há uma seção inteira sobre cotação. Porque este licenciado sob a GFDL, que não é compatível com a licença CC-BY-SA usada aqui, não vou citar a coisa toda, mas realmente lendo essa é a resposta mais definitiva .

Em resumo, as aspas simples param toda a interpretação - a string é renderizada literalmente. Aspas duplas deixam $ (sinal de dólar), '(backquote) como especial e \ (barra invertida) como especiais quando seguidos por alguns outros caracteres. E ! será tratado especialmente se o recurso de expansão de histórico estiver ativado (o que é por padrão).

No uso prático, o $ é o grande problema, já que muitas vezes você pode querer as várias expansões que ele permite (variáveis e mais), enquanto ainda impede que o shell atrapalhe a maior parte da linha de comando.

    
por 17.02.2011 / 15:34
1

Enquanto aspas simples preservam o valor literal de todos os caracteres que incluem,

as aspas duplas diferem na medida em que não preservam o valor literal do cifrão, $, as marcas de retorno, - - e a barra invertida,.

Quando colocado entre aspas duplas, o cifrão e as contra-notas preservam seu significado especial, e o significado especial do caractere de barra invertida é retido apenas quando precede um sinal de dólar, carrapato, aspas duplas, barra invertida ou nova linha .

Exemplo:

[user@localhost~]$ echo '$HOME'
$HOME
[user@localhost~]$ echo ''pwd''
'pwd'
[user@localhost~]$ echo '"Hello world"'
"Hello world"

[user@localhost~]$ echo "$HOME"
/home/user
[user@localhost~]$ echo "'pwd'"
/home/user

[user@localhost~]$ echo ""Hello world""
Hello world
[user@localhost~]$ echo "\$HOME"
$HOME
[user@localhost~]$ echo "\'pwd\'"
'pwd'
[user@localhost~]$ echo "\"Hello ,world\""
"Hello, world"
    
por 11.04.2017 / 10:35