Diferenças entre doublequotes “”, singlequotes '' e backticks '' na linha de comando?

40

Muitas vezes vejo tutoriais na Web ou postagens neste site que fazem uso pesado dos seguintes caracteres na linha de comando. Muitas vezes parece que eles são usados para propósitos bastante semelhantes. Quais são as diferenças entre eles quando usados na linha de comando ou para programação de shell? Para que finalidade utilizo qual deles?

" " double quotes

' ' single quotes

' ' backticks
    
por NES 04.01.2011 / 17:24

6 respostas

42

Por exemplo, considere essa variável foo contém uname ( foo=uname ).

  • echo "$foo" outputs uname , substituindo as variáveis no texto.
    • Para um caractere literal $ dentro de " quotes, use \$ ; para um literal " , use \" .
  • echo '$foo' outputs $foo , a string exata.
    • Mesmo ' não pode ser ignorado como \' dentro de ' orçamentos. Mas você pode usar 'foo'\''bar' .
  • echo '$foo' outputs Linux , executando o conteúdo da variável e echo imprimindo.
por shellholic 04.01.2011 / 17:53
11

Isso é explicado muito bem na seção relevante do manual da 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 sem aspas:

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

Aspas duplas permitem a expansão de variáveis (também a expansão do histórico e algumas outras coisas). Basicamente, você os 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, as aspas simples protegem completamente uma string do shell, enquanto as aspas duplas protegem algumas coisas (espaços, por exemplo), mas permitem que variáveis e caracteres especiais sejam expandidos / interpretados corretamente.

    
por terdon 16.09.2014 / 20:31
4

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 cifrão ( $ ), os backticks (aspas simples invertidas, '' ) e a barra invertida ( \ ).

Quando fechado dentro de carrapatos ( '' ), o shell interpreta algo para significar "a saída do comando dentro dos carrapatos". Isso é chamado de "substituição de comando", pois a saída do comando é substituída pelo próprio comando.

Referências

:

por aneeshep 04.01.2011 / 17:28
3
echo '$HOME' is "$HOME"

As aspas simples impedem a expansão das variáveis, enquanto as aspas duplas permitem isso.

    
por ubfan1 16.09.2014 / 20:25
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" resultará: Hello my name is NESS

'' - Usado para mostrar a saída como ela é. (Também como em PHP.)

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

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

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

    
por Luis Alvarado 04.01.2011 / 17:32
0

As aspas simples incluem um valor que deve ser considerado literalmente: todos os tipos de expansão são suprimidos. Geralmente usado se o valor incluir ou incluir espaço em branco (espaço, tabulação, nova linha) ou caracteres especiais ( $ , \ , ' ) que o usuário não deseja que seja expandido / tratado especialmente por A concha.

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

As citações anteriores incluem um comando, cujos resultados são desejados como valor. Novos shells permitem o uso de $(...) no lugar de '...' . Eu prefiro o método mais recente.

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

CMD='ls .'
echo sq: $CMD
set $CMD
echo raw 1: $1
echo raw: $*
set "$CMD"
echo dq: $1
echo bq: '$CMD'
echo new: $($CMD)
    
por BillThor 04.01.2011 / 18:42