1217 votes

Échapper les guillemets simples au sein d'une même cité, les chaînes de

Disons que vous avez un alias bash comme

alias rxvt='urxvt'

qui fonctionne très bien.

alias rxvt='urxvt -fg '#111111' -bg '#111111''

ne fonctionne pas, et ne le fera:

alias rxvt='urxvt -fg \'#111111\' -bg \'#111111\''

Alors, comment vous finissez par correspondance entre l'ouverture et la fermeture des guillemets à l'intérieur d'une chaîne, une fois que vous avez échappé d'un devis?

alias rxvt='urxvt -fg'\''#111111'\'' -bg '\''#111111'\''

semble anormale, bien que ce serait la même chaîne si vous êtes autorisés à les enchaîner comme ça.

1696voto

liori Points 13629

Si vous voulez vraiment utiliser des guillemets simples dans la couche la plus externe, n'oubliez pas que vous pouvez coller les deux types de devis. Exemple:

 alias rxvt='urxvt -fg '"'"'#111111'"'"' -bg '"'"'#111111'"'"
                       12345

Explication:

(1) Fin de la première citation qui utilise des guillemets simples.

(2) le Début de la deuxième citation, en utilisant des guillemets.

(3) Cité de caractère.

(4) en Fin de deuxième citation, en utilisant des guillemets.

(5) Début de la troisième citation, utiliser des guillemets simples.

Si vous ne placez pas d'espaces entre (1) et (2), ou entre (4) et (5), le shell va interpréter cette chaîne comme un mot long.

314voto

Adrian Pronk Points 5810

Je l'ai toujours remplacer chaque intégré unique d'un devis de la séquence: '\'' (c'est-à: citation barre oblique inverse citation citation) qui ferme la chaîne, ajoute un échappé de devis unique et rouvre la chaîne. J'ai souvent concocter un "quotify" dans mes scripts Perl pour faire cela pour moi. Les étapes seraient:

s/'/'\\''/g    # Handle each embedded quote
$_ = qq['$_']; # Surround result with single quotes.

Ce joli beaucoup prend soin de tous les cas.

La vie devient plus amusant quand vous vous introduire eval dans votre shell-scripts. Vous avez re-quotify tout nouveau!

Par exemple, créez un script Perl appelé quotify contenant les déclarations ci-dessus:

#!/usr/bin/perl -pl
s/'/'\\''/g;
$_ = qq['$_'];

puis l'utiliser pour générer correctement-chaîne entre guillemets:

$ quotify
urxvt -fg '#111111' -bg '#111111'

résultat:

'urxvt -fg '\''#111111'\'' -bg '\''#111111'\'''

qui peut ensuite être copié/collé dans la commande alias:

alias rxvt='urxvt -fg '\''#111111'\'' -bg '\''#111111'\'''

(Si vous avez besoin d'insérer la commande dans un eval, exécutez la quotify de nouveau:

 $ quotify
 alias rxvt='urxvt -fg '\''#111111'\'' -bg '\''#111111'\'''

résultat:

'alias rxvt='\''urxvt -fg '\''\'\'''\''#111111'\''\'\'''\'' -bg '\''\'\'''\''#111111'\''\'\'''\'''\'''

qui peut être copié/collé dans un eval:

eval 'alias rxvt='\''urxvt -fg '\''\'\'''\''#111111'\''\'\'''\'' -bg '\''\'\'''\''#111111'\''\'\'''\'''\'''

258voto

mj41 Points 353

Pour Bash cela devrait fonctionner:

alias rxvt=$'urxvt -fg \'#111111\' -bg \'#111111\''

D' man bash:

Les mots de la forme $('string' sont traitées spécialement. Le mot s'étend à la chaîne, avec une barre oblique inverse-des caractères d'échappement remplacé comme spécifié par la norme ANSI C standard. Barre oblique inverse des séquences d'échappement, si présents, sont décodés comme suit:

  \\     backslash
  \'     single quote
  \"     double quote
  \n     new line
  ...

Voir l'exemple:

  > echo $'aa\'bb'
  aa'bb

Voir les Citations et d'évasion: ANSI C comme les chaînes sur bash-hackers.org wiki pour plus de détails.

55voto

Steve B. Points 23227

Je ne vois pas l'entrée sur son blog (lien pls?) mais, selon la gnu manuel de référence:

En joignant les caractères entre guillemets simples (‘') préserve la valeur littérale de chaque personnage dans le devis. Un devis unique peut ne pas se produire entre les guillemets simples, même quand il est précédé par un barre oblique inverse.

si bash ne comprends pas:

alias x='y \'z '

cependant, vous pouvez le faire si vous entourer de guillemets:

alias x="echo \'y "
> x
> 'y

40voto

mikhail_b Points 367

Je peux confirmer que l'utilisation d' '\'' pour une seule citation à l'intérieur d'une unique chaîne de caractères entre guillemets fonctionne en Bash, et qui peut être expliqué de la même manière que le "collage" argument de plus tôt dans le thread. Supposons que nous avons une chaîne de caractères entre guillemets: 'A '\''B'\'' C' (toutes les citations sont ici des guillemets simples). Si il est passé à l'écho, il imprime le suivant: A 'B' C. Dans chaque '\'' le premier devis ferme l'unique chaîne de caractères entre guillemets, à la suite de \' colles une apostrophe à la chaîne précédente (\' est un moyen de spécifier un seul devis sans démarrer une chaîne de caractères entre guillemets), et la dernière citation ouvre une unique chaîne de caractères entre guillemets.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X