Devis simple entre guillemets doubles et manuel de référence Bash

18

Dans la section 3.1.2.3 intitulée Double Quotes, le manuel Bash dit:

Le fait de placer des caractères entre guillemets doubles ('"') préserve la valeur littérale de tous les caractères entre guillemets, à l'exception de '$', '' ',' \ 'et, lorsque l'expansion de l'historique est activée,'! '.

Pour le moment, je suis préoccupé par la citation unique ( ').

Sa signification particulière, décrite dans la section précédente, la section 3.1.2.2 est:

La présence de caractères entre guillemets simples ( ') préserve la valeur littérale de chaque caractère entre guillemets. Un guillemet simple ne peut pas apparaître entre guillemets simples, même lorsqu'il est précédé d'une barre oblique inverse.

Combinant les deux expositions,

 echo "'$a'"

où la variable an'est pas définie (d'où $a= chaîne nulle), devrait $as'afficher à l'écran, car '', ayant sa signification spéciale à l'intérieur, protégerait $de l'interprétation spéciale. Au lieu de cela, il imprime ''. Pourquoi

Lavya
la source

Réponses:

21

Le 'caractère guillemet simple dans votre echoexemple obtient sa valeur littérale (et perd sa signification) car il est placé entre guillemets doubles ( "). Les caractères englobants sont les guillemets doubles.

Ce que vous pouvez faire est d'imprimer les guillemets simples séparément:

echo "'"'$a'"'"

ou échapper à $:

echo "'\$a'"
Anthon
la source
Oh tu as tout à fait raison! Le résultat est conforme à votre réponse, mais mon doute portait sur la ligne "Les caractères entre guillemets ('"') préservent la valeur littérale de tous les caractères entre guillemets, à l'exception de '$', ' ’, ‘\’, 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' Je vous remercie de votre réponse rapide. Merci
Lavya
2
Le deuxième caractère mentionné dans le manuel est le backtick et non le tilde.
Kenny Evitt
6

Vous comprenez mal la documentation:

avoir sa signification spéciale à l'intérieur, protégerait $ de l'interprétation spéciale

"Ayant sa signification particulière" signifie qu'il est interprété spécialement pas littéralement. Les guillemets simples empêchent $d'être développés. Mais les guillemets simples entre guillemets doubles sont des caractères littéraux, c'est-à-dire qu'ils n'affectent rien. Si vous voulez la sortie, $avous en avez besoin echo '$a'.

Hauke ​​Laging
la source
tu as raison. Non seulement j'ai mal compris le document, mais je l'ai mal lu (taling "` "for" '"!). vous avez raison sur "les guillemets simples entre guillemets doubles sont des caractères littéraux". Merci!
Lavya