Diferença entre aspas simples e duplas no Bash

No Bash, quais são as diferenças entre aspas simples ( '' ) e aspas duplas ( "" )?

Aspas simples não interpolam nada, mas as aspas duplas serão. Por exemplo: variables, backticks, certos \ escapes, etc.

Exemplo:

 $ echo "$(echo "upg")" upg $ echo '$(echo "upg")' $(echo "upg") 

O manual do Bash tem isto a dizer:

3.1.2.2 Citações Únicas

Inserir caracteres entre aspas simples ( ' ) preserva o valor literal de cada caractere entre aspas. Uma aspa simples pode não ocorrer entre aspas simples, mesmo quando precedidas por uma barra invertida.

3.1.2.3 Cotações Duplas

Incluir caracteres entre aspas duplas ( " ) preserva o valor literal de todos os caracteres dentro das aspas, com exceção de $ , ` , \ e, quando a expansão de histórico é ativada ! Os caracteres $ e ` mantêm seu significado especial dentro de double citações (consulte Expansões da Shell ) A barra invertida mantém seu significado especial somente quando seguida por um dos seguintes caracteres: $ , ` , " , \ ou newline. Dentro de aspas duplas, as barras invertidas seguidas por um desses caracteres são removidas. As barras invertidas que precedem os caracteres sem um significado especial são deixadas inalteradas. Uma aspa dupla pode ser citada entre aspas duplas precedendo-a com uma barra invertida. Se ativado, a expansão do histórico será executada, a menos que um ! aparecendo entre aspas duplas é escapado usando uma barra invertida. A barra invertida que precede o ! não é removido.

Os parâmetros especiais * e @ têm um significado especial quando em aspas duplas (consulte Expansão do Parâmetro do Shell ).

Se você está se referindo ao que acontece quando você faz eco de algo, as aspas simples literalmente ecoam o que você tem entre elas, enquanto as aspas duplas avaliam as variables ​​entre elas e geram o valor da variável.

Por exemplo, isso

 #!/bin/sh MYVAR=sometext echo "double quotes gives you $MYVAR" echo 'single quotes gives you $MYVAR' 

vai dar isso:

 double quotes gives you sometext single quotes gives you $MYVAR 

A resposta aceita é ótima. Estou fazendo uma tabela que ajuda na compreensão rápida do tópico. A explicação envolve uma variável simples, bem como uma matriz indexada arr .

Se nós definirmos

 a=apple # a simple variable arr=(apple) # an indexed array with a single element 

e, em seguida, echo a expressão na segunda coluna, obteríamos o resultado / comportamento mostrado na terceira coluna. A quarta coluna explica o comportamento.

  # | Expression | Result | Comments ---+-------------+-------------+-------------------------------------------------------------------- 1 | "$a" | apple | variables are expanded inside "" 2 | '$a' | $a | variables are not expanded inside '' 3 | "'$a'" | 'apple' | '' has no special meaning inside "" 4 | '"$a"' | "$a" | "" is treated literally inside '' 5 | '\'' | **invalid** | can not escape a ' within ''; use "'" or $'\'' (ANSI-C quoting) 6 | "red$arocks"| red | $arocks does not expand $a; use ${a}rocks to preserve $a 7 | "redapple$" | redapple$ | $ followed by no variable name evaluates to $ 8 | '\"' | \" | \ has no special meaning inside '' 9 | "\'" | ' | \' is interpreted inside "" 10 | "\"" | " | \" is interpreted inside "" 11 | "*" | * | glob does not work inside "" or '' 12 | "\t\n" | \t\n | \t and \n have no special meaning inside "" or ''; use ANSI-C quoting 13 | "`echo hi`" | hi | `` and $() are evaluated inside "" 14 | '`echo hi`' | `echo hi` | `` and $() are not evaluated inside '' 15 | '${arr[0]}' | ${arr[0]} | array access not possible inside '' 16 | "${arr[0]}" | apple | array access works inside "" 17 | $'$a\'' | $a' | single quotes can be escaped inside ANSI-C quoting 18 | "$'\t'" | $'\t' | ANSI quoting is not interpreted inside "" 19 | '!cmd' | !cmd | history expansion character '!' is ignored inside '' 20 | "!cmd" | cmd args | expands to the most recent command matching "cmd" ---+-------------+-------------+-------------------------------------------------------------------- 

Veja também:

  • ANSI-C citando com $'' – GNU Bash Manual
  • Tradução local com $"" – GNU Bash Manual
  • Uma fórmula de três pontos para cotações

Outros explicaram muito bem e só querem dar exemplos simples.

Aspas simples podem ser usadas em torno do texto para impedir que o shell interprete quaisquer caracteres especiais. Cifrões, espaços, e comercial, asteriscos e outros caracteres especiais são todos ignorados quando colocados entre aspas simples.

 $ echo 'All sorts of things are ignored in single quotes, like $ & * ; |.' 

Isso dará isto:

 All sorts of things are ignored in single quotes, like $ & * ; |. 

A única coisa que não pode ser colocada entre aspas simples é uma simples cotação.

Aspas duplas agem de forma semelhante às aspas simples, exceto que as aspas duplas ainda permitem que o shell interprete cifrões, citações anteriores e barras invertidas. Já se sabe que as barras invertidas impedem que um único caractere especial seja interpretado. Isso pode ser útil entre aspas duplas se um sinal de dólar precisar ser usado como texto em vez de uma variável. Ele também permite que aspas duplas sejam escapadas, de forma que elas não sejam interpretadas como o final de uma string entre aspas.

 $ echo "Here's how we can use single ' and double \" quotes within double quotes" 

Isso dará isto:

 Here's how we can use single ' and double " quotes within double quotes 

Também pode ser notado que o apóstrofo, que caso contrário seria interpretado como o início de uma seqüência de caracteres entre aspas, é ignorado entre aspas duplas. As variables, no entanto, são interpretadas e substituídas por seus valores entre aspas duplas.

 $ echo "The current Oracle SID is $ORACLE_SID" 

Isso dará isto:

 The current Oracle SID is test 

As citações anteriores são totalmente diferentes das aspas simples ou duplas. Em vez de serem usados ​​para impedir a interpretação de caracteres especiais, as retrocedidas realmente forçam a execução dos comandos que elas contêm. Depois que os comandos fechados são executados, sua saída é substituída no lugar das aspas traseiras na linha original. Isso ficará mais claro com um exemplo.

 $ today=`date '+%A, %B %d, %Y'` $ echo $today 

Isso dará isto:

 Monday, September 28, 2015 

Existe uma clara distinção entre o uso de ' ' e ' ' .

Quando ' ' é usado em torno de qualquer coisa, não há “transformação ou tradução” feita. É impresso como é.

Com " " , o que quer que rodeia, é “traduzido ou transformado” em seu valor.

Por tradução / transformação quero dizer o seguinte: Qualquer coisa dentro das aspas simples não será “traduzida” para seus valores. Eles serão tomados como estão dentro de citações. Exemplo: a=23 , então echo '$a' produzirá $a na saída padrão. Considerando que o echo "$a" produzirá 23 na saída padrão.