web-dev-qa-db-fra.com

Comment échapper à l'apostrophe d'une chaîne entre guillemets dans bash?

Je ne comprends pas comment bash évalue l'échappement des caractères apostrophe dans des chaînes entre guillemets.

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?

16
Kibet

Entre guillemets simples, aucune évasion n'est possible. Il n'y a aucun moyen d'inclure une citation unique dans des citations simples. Voir Citant dans man bash .

17
choroba

En plus des guillemets simples et doubles pris en charge par POSIX, bash fournit un type de guillemet supplémentaire pour autoriser une petite classe de caractères d'échappement (y compris un guillemet simple) dans une chaîne entre guillemets:

$ echo $'\'Hello World\''
'Hello World'

Reportez-vous à la section QUOTING de la page de manuel bash, vers la fin de la section. (Recherchez "ANSI C".)

7
chepner

Pour expliquer ce qui se passe avec vos apostrophes échappés, examinons votre deuxième exemple (voir aussi guillemets simples , ou guillemets forts ):

$ echo '\'Hello World\''
>     # expects you to continue input

Ici, vous avez laissé la citation en suspens, comme vous l'avez dit. Maintenant, coupez la fin et changez le en:

                     v                                v           v
$ echo '\'Hello World     # Echo two strings: '\' and 'Hello World'.
\Hello World         ^

La sous-chaîne "Hello World" n'était pas citée ici, mais elle se comportait comme si elle était forte citée. En utilisant votre exemple à nouveau, coupez la fin différemment cette fois-ci:

                     vv                                    v (plain apostrophe)
$ echo '\'Hello World\'   # Will echo: '\' and 'Hello World''
\Hello World'        ^^   # Note that the trailing ' char is backslash escaped. 

La sous-chaîne "Hello World" se comporte à nouveau comme s'il s'agissait d'une citation forte, avec seulement l'apostrophe ajoutée (échappé, donc plus un guillemet) à la fin.

Lorsqu'un autre guillemet est ajouté à la fin (votre exemple d'origine), la chaîne est laissée en attente et attend un guillemet proche.

3
zero2cx

Exemple simple de citations d'échappement dans Shell:

$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc

Pour ce faire, fermez celui qui est déjà ouvert ('), placez celui qui est échappé (\') pour imprimer, puis ouvrez-en un autre (').

Alternativement:

$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc

Cela se fait en finissant un code déjà ouvert ('), en plaçant la citation dans un autre devis ("'"), puis en en ouvrant un autre (').

Ce que vous avez fait ('\'Hello World\''), c'est:

  1. 1ère apostrophe ouverte: '.
  2. Fermé juste après \', la chaîne devient: '\'.
  3. Hello World n'est pas des guillemets.
  4. Apostrophe autonome (\') sans l'ouvrir.
  5. La dernière apostrophe (') est une chaîne d'ouverture, mais aucune chaîne de fermeture n'est attendue.

Donc, le bon exemple serait:

$ echo \'Hello World\'
'Hello World'

Connexes: Comment échapper à des guillemets simples dans des chaînes à guillemets simples?

3
kenorb