Differenza tra virgolette singole e doppie in Bash

In Bash, quali sono le differenze tra virgolette singole ( '' ) e virgolette ( "" )?

Le virgolette singole non interpoleranno nulla, ma le virgolette doppie lo faranno. Ad esempio: variabili, backtick, certi \ escape, ecc.

Esempio:

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

Il manuale di Bash ha questo da dire:

3.1.2.2 Virgolette singole

Racchiudere i caratteri tra virgolette singole ( ' ) mantiene il valore letterale di ciascun carattere tra virgolette. Una virgoletta singola non può verificarsi tra virgolette singole, anche se precedute da una barra rovesciata.

3.1.2.3 Virgolette doppie

Racchiudere i caratteri tra virgolette ( " ) mantiene il valore letterale di tutti i caratteri all’interno delle virgolette, ad eccezione di $ , ` , \ , e, quando l’espansione della cronologia è abilitata ! I caratteri $ e ` mantengono il loro significato speciale all’interno del doppio virgolette (vedere Espansioni di shell ). La barra rovesciata conserva il suo significato speciale solo se seguita da uno dei seguenti caratteri: $ , ` , " , \ , o newline. Tra virgolette doppie, i backslash seguiti da uno di questi caratteri vengono rimossi. Le barre rovesciate che precedono i caratteri senza un significato speciale non vengono modificate. Una virgoletta doppia può essere citata tra virgolette precedendola con una barra rovesciata. Se abilitato, l’espansione della cronologia verrà eseguita a meno che un ! comparire tra virgolette viene fatto sfuggire utilizzando una barra rovesciata. Il backslash che precede il ! non viene rimosso.

I parametri speciali * e @ hanno un significato speciale quando si trovano tra virgolette doppie (vedere Espansione parametri shell ).

Se ti riferisci a ciò che accade quando fai eco a qualcosa, le virgolette singole rimandano letteralmente a ciò che hai tra di loro, mentre le virgolette doppie valutano le variabili tra loro e producono il valore della variabile.

Ad esempio, questo

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

darà questo:

 double quotes gives you sometext single quotes gives you $MYVAR 

La risposta accettata è ottima. Sto facendo una tabella che aiuta a comprendere rapidamente l’argomento. La spiegazione coinvolge una semplice variabile a così come un array di indici arr .

Se ci mettiamo

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

e quindi echo l’espressione nella seconda colonna, otterremmo il risultato / comportamento mostrato nella terza colonna. La quarta colonna spiega il 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" ---+-------------+-------------+-------------------------------------------------------------------- 

Guarda anche:

  • Quotazione ANSI-C con $'' – GNU Bash Manual
  • Traduzione locale con $"" – Manuale GNU Bash
  • Una formula a tre punti per le virgolette

Altri hanno spiegato molto bene e vogliono solo dare esempi semplici.

Le virgolette singole possono essere usate attorno al testo per impedire alla shell di interpretare caratteri speciali. Segni del dollaro, spazi, e commerciali, asterischi e altri caratteri speciali vengono tutti ignorati quando racchiusi tra virgolette singole.

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

Darà questo:

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

L’unica cosa che non può essere racchiusa tra virgolette singole è una singola citazione.

Le virgolette agiscono in modo simile alle virgolette singole, ad eccezione delle doppie virgolette che consentono comunque alla shell di interpretare i segni del dollaro, le virgolette posteriori e le barre retroverse. È già noto che i backslash impediscono l’interpretazione di un singolo carattere speciale. Questo può essere utile tra virgolette se un simbolo del dollaro deve essere usato come testo anziché come variabile. Consente inoltre di eseguire l’escape di virgolette doppie in modo che non vengano interpretate come la fine di una stringa tra virgolette.

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

Darà questo:

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

Si può anche notare che l’apostrofo, che altrimenti sarebbe interpretato come l’inizio di una stringa quotata, viene ignorato tra virgolette doppie. Le variabili, tuttavia, vengono interpretate e sostituite con i loro valori all’interno di virgolette.

 $ echo "The current Oracle SID is $ORACLE_SID" 

Darà questo:

 The current Oracle SID is test 

Le virgolette posteriori sono completamente diverse da virgolette singole o doppie. Invece di essere usati per impedire l’interpretazione di caratteri speciali, le virgolette posteriori in realtà impongono l’esecuzione dei comandi che racchiudono. Dopo l’esecuzione dei comandi chiusi, il loro output viene sostituito al posto delle virgolette posteriori nella riga originale. Questo sarà più chiaro con un esempio.

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

Darà questo:

 Monday, September 28, 2015 

C’è una chiara distinzione tra l’uso di ' ' e " " .

Quando ' ' è usato attorno a qualcosa, non c’è “trasformazione o traduzione” fatta. È stampato così com’è.

Con " " , qualunque cosa circonda, viene “tradotto o trasformato” nel suo valore.

Per traduzione / trasformazione intendo il seguente: Qualsiasi cosa all’interno delle virgolette singole non sarà “tradotta” nei loro valori. Saranno presi come sono tra virgolette. Esempio: a=23 , quindi echo '$a' produrrà $a su output standard. Mentre echo "$a" produrrà 23 in uscita standard.