Virgoletta singola tra virgolette doppie e il manuale di riferimento di Bash


18

Nella sezione 3.1.2.3 intitolata Double Quotes, il manuale di Bash dice:

Racchiudere i caratteri tra virgolette doppie ('"') conserva il valore letterale di tutti i caratteri tra virgolette, ad eccezione di '$', '`', '\' e, quando l'espansione della cronologia è abilitata, '!'.

Al momento mi occupo dell'unica citazione ( ').

È un significato speciale, descritto nella sezione precedente, la sezione 3.1.2.2 è:

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

Combinando le due esposizioni,

 echo "'$a'"

dove la variabile anon è definita (quindi $a= stringa nulla), dovrebbe essere stampata $asullo schermo, poiché '', avendo il suo significato speciale all'interno, sarebbe protetta $dall'interpretazione speciale. Invece, stampa ''. Perchè così?

Risposte:


21

Il 'carattere di virgoletta singola nel tuo echoesempio ottiene il valore letterale (e perde il suo significato) come racchiuso tra virgolette doppie ( "). I caratteri che racchiudono sono le doppie virgolette.

Quello che puoi fare è stampare le virgolette singole separatamente:

echo "'"'$a'"'"

o sfuggire a $:

echo "'\$a'"

Oh hai perfettamente ragione! L'output è coerente con la tua risposta, ma il mio dubbio era con la riga "Racchiudere i caratteri tra virgolette doppie ('"') preserva il valore letterale di tutti i caratteri tra virgolette, ad eccezione di '$', ' ’, ‘\’, and, when history expansion is enabled, ‘!’." in the manual. But now reading it again I realized the second character is not single quote, ("'") but tilde (""). I' Sono grato per la tua rapida risposta, grazie!
Lavya,

2
Il secondo personaggio menzionato nel manuale è il dorso non la tilde.
Kenny Evitt,

6

Si fraintende la documentazione:

avendo il suo significato speciale dentro, proteggerebbe $ dall'interpretazione speciale

"Avere il suo significato speciale" significa che è interpretato specialmente non letteralmente. Le virgolette singole impediscono $l'espansione. Ma le virgolette singole tra virgolette doppie sono caratteri letterali, cioè non influenzano nulla. Se vuoi l'output, $aallora hai bisogno echo '$a'.


hai ragione. Non ho solo frainteso il documento, l'ho letto male (raccontando "` "per" '"!). hai ragione su "le virgolette singole tra virgolette doppie sono caratteri letterali". Grazie!
Lavya,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.