Je ne comprends pas comment bash évalue l'échappement de caractères d'apostrophe dans des chaînes entre guillemets simples.
Voici un exemple:
$ echo ''\''Hello World'\'''
'Hello World' # works
$ echo '\'Hello World\''
> # expects you to continue input
J'ai essayé de chercher des explications à cela, mais je n'ai rien pu obtenir. Que fait bash ici?
echo \''Hello World'\'
Réponses:
Dans les guillemets simples, aucun échappement n'est possible. Il n'y a aucun moyen d'inclure un guillemet simple dans des guillemets simples. Voir Citation dans man bash .
la source
echo '\''
echo $'\'hello world\''
En plus des
bash
guillemets simples et doubles pris en charge par POSIX, fournit un type supplémentaire de guillemets pour autoriser une petite classe de caractères d'échappement (y compris un guillemet simple) dans une chaîne entre guillemets:Voir la section QUOTING dans la
bash
page de manuel, vers la fin de la section. (Recherchez "ANSI C".)la source
Pour expliquer ce qui se passe avec vos apostrophes échappées, nous examinerons votre deuxième exemple (voir également les guillemets simples ou les guillemets forts ):
Ici, vous avez laissé la citation suspendue, comme vous l'avez dit. Maintenant, coupez l'extrémité et changez-la en:
La sous-chaîne "Hello World" n'était pas citée ici, mais elle se comportait comme si elle était fortement citée. En utilisant à nouveau votre exemple, coupez la fin différemment cette fois:
La sous-chaîne "Hello World" se comporte à nouveau comme si elle était entre guillemets forts, avec seulement l'apostrophe ajoutée (échappée, donc plus une seule citation) à la fin.
Lorsqu'un autre guillemet simple est ajouté à la fin (votre exemple d'origine), la chaîne reste suspendue et attend un guillemet de fermeture.
la source
Exemple simple d'échapper des guillemets dans le shell:
Pour ce faire, fermez un (
'
) déjà ouvert , placez un (\'
) échappé à imprimer, puis ouvrez-en un autre ('
).Alternativement:
Cela se fait en terminant un (
'
) déjà ouvert , en plaçant un guillemet dans un autre guillemet ("'"
), puis en ouvrant un autre ('
).Ce que vous avez fait (
'\'Hello World\''
), c'est:'
.\'
, de sorte que la chaîne devient:'\'
.Hello World
n'est pas des guillemets.\'
) sans l'ouvrir.'
) est une chaîne d'ouverture, mais aucune fermeture n'est attendue.Ainsi, l'exemple correct serait:
Connexe: Comment échapper les guillemets simples dans les chaînes entre guillemets simples?
la source