Diferenças entre aspas duplas “”, aspas simples '' e backticks `` na linha de comando?

43

Frequentemente, vejo tutoriais na Web ou postagens neste site que fazem uso intenso dos seguintes caracteres na linha de comando. Muitas vezes, parece que eles são usados ​​para fins bastante semelhantes. Quais são as diferenças entre eles quando usados ​​na linha de comando ou na programação de shell? Para que finalidade eu uso qual deles?

" " double quotes

' ' single quotes

` ` backticks
NES
fonte

Respostas:

43

Por uma questão de exemplo, considere que a variável foocontém uname( foo=uname).

  • echo "$foo"saídas uname, substituindo variáveis ​​no texto.
    • Para um $caractere literal entre "aspas, use \$; para um literal ", use \".
  • echo '$foo'saídas $foo, a sequência exata.
    • Mesmo 'não pode ser escapado como aspas \'internas '. Mas você pode usar 'foo'\''bar'.
  • echo `$foo`saídas Linux, executando o conteúdo da variável e echoimprimindo-o.
shellholic
fonte
\sempre é tratado literalmente entre aspas simples, mesmo que preceda a '. Após uma abertura ', a próxima 'é sempre interpretada como a citação final. Algo como citar 'em uma sequência de aspas simples pode ser alcançado terminando a citação, escapando 'individualmente e iniciando a citação novamente. Ou seja, embora \'não funcione entre abrir e fechar 'caracteres, '\''funciona. (Veja Gilles de correção para um dos meus posts quando eu tinha feito o mesmo erro para mais detalhes.)
Elias Kagan
11

Isso é explicado muito bem na seção relevante do manual do bash. Resumidamente, qualquer coisa entre aspas simples é interpretada literalmente. Então, por exemplo:

$ echo '$SHELL'
$SHELL
$ echo '{1..3}'
{1..3}

Compare isso com as versões não citadas:

$ echo $SHELL
/bin/bash
$ echo {1..3}
1 2 3

As aspas duplas permitem a expansão variável (também a expansão do histórico e outras coisas). Basicamente, você as usa quando está lidando com algo que deseja ver expandido. Por exemplo:

$ echo "$SHELL"
/bin/bash
$ echo "!!"
echo "echo "$SHELL""
echo /bin/bash

Em outras palavras, aspas simples protegem completamente uma string do shell, enquanto aspas duplas protegem algumas coisas (espaços, por exemplo), mas permitem que variáveis ​​e caracteres especiais sejam expandidos / interpretados corretamente.

terdon
fonte
1
não tem certeza se o OP foi alterado após o fato, mas esta resposta não menciona backticks?
Alexander Mills
5

Aspas simples ( '') são usadas para preservar o valor literal de cada caractere entre aspas.

Usando aspas duplas ( ""), o valor literal de todos os caracteres incluídos é preservado, exceto o sinal de cifrão ( $), os bastidores (aspas simples anteriores ``) e a barra invertida ( \).

Quando colocado dentro de back-ticks ( ``), o shell interpreta algo como "a saída do comando dentro dos back-ticks". Isso é chamado de "substituição de comando", pois a saída do comando é substituída pelo próprio comando.

referências:

aneeshep
fonte
3
echo '$HOME' is "$HOME"

Aspas simples impedem a expansão da variável, enquanto as aspas duplas o permitem.

ubfan1
fonte
2

Estou apenas falando em geral, mas:

""- Usado para processar algumas informações dentro deles antes da saída. (Como no PHP.)

  • Por exemplo: name=NESS; echo "Hello my name is $name"irá produzir:Hello my name is NESS

''- Usado para mostrar a saída como está. (Também como no PHP.)

  • Usando o exemplo acima, ele produzirá Hello my name is $name

Portanto, a diferença entre aspas duplas e simples é que aspas duplas processam a variável e mostram o valor, enquanto aspas simples mostram o nome da variável sem processamento.

`` - Usado para citar comandos que são atribuídos posteriormente a outra variável.

Luis Alvarado
fonte
1

Aspas simples incluem um valor que deve ser tomado literalmente: todos os tipos de expansão são suprimidos. Normalmente usado se o valor inclui ou pode incluir espaço em branco (espaço, tabulação, nova linha), ou caracteres especiais ( $, \, `) que o usuário não quer ser expandido / tratados especialmente pelo shell.

Aspas duplas incluem um valor que terá variáveis ​​e a substituição de caracteres concluída. Necessário quando a saída pode conter espaços em branco e deve ser designado como um valor único.

As aspas traseiras incluem um comando, cujos resultados são desejados como valor. Os reservatórios mais recentes permitem o uso $(...)no lugar de `...`. Eu prefiro o método mais novo.

O código a seguir pode ajudar a entender o que está acontecendo.

CMD = 'ls'.
echo sq: $ CMD
definir $ CMD
eco bruto 1: $ 1
eco bruto: $ *
defina "$ CMD"
eco dq: $ 1
echo bq: `$ CMD`
eco novo: $ ($ CMD)
BillThor
fonte