104 votes

Comment le signe dollar de tête affecte-t-il les apostrophes simples dans Bash ?

J'ai besoin de transmettre une chaîne de caractères à un programme en tant qu'argument à partir de l'interface de ligne de commande Bash, par exemple

 programme "ne pas faire cela"

La chaîne peut inclure n'importe quel caractère comme '$', '\', etc. et je ne veux pas que Bash fasse de modification. Alors je pense à utiliser des guillemets simples.

Cependant, ce qui suit ne fonctionne pas:

 programme 'don\'t do this'            //l'échappement ne fonctionne pas avec les guillemets simples

Alors que les deux suivants fonctionnent:

 programme $'dont\'t do this'          //semble fonctionner, mais y a-t-il d'autres effets secondaires?
 programme 'dont'\''do this'           //diviser en 3 parties

La première approche semble meilleure car elle nécessite moins de pré-modification (mettre le symbole du dollar devant et substituer chaque \ par \\), mais je ne sais pas ce que le SYMBOLE DU DOLLAR pourrait faire d'autre.

J'ai vraiment fait des recherches sur Google mais je ne trouve pas ce dont j'ai besoin...

136voto

Ignacio Vazquez-Abrams Points 312628

Cela provoque l'interprétation des séquences d'échappement.

$ echo $'Name\tAge\nBob\t24\nMary\t36'
Name    Age
Bob     24
Mary    36

Après l'expansion de ces séquences, le résultat est mis entre guillemets simples, comme si le signe dollar n'avait pas été présent.

46voto

Aaron Digulla Points 143830

En utilisant $ comme préfixe, BASH recherche une variable avec ce nom. $' est une syntaxe spéciale (entièrement expliquée ici) qui permet le traitement des chaînes ANSI-C. Dans ce cas, le simple guillemet n'est pas "prendre la valeur littéralement jusqu'au prochain guillemet simple". Cela devrait être assez sûr à utiliser. Les inconvénients sont qu'il est spécifique à BASH et assez peu commun, donc beaucoup de gens se demanderont ce que cela signifie.

La meilleure façon est d'utiliser des guillemets simples. Si vous avez besoin d'un guillemet simple dans une chaîne, vous devez le remplacer par '\''. Cela termine la chaîne simple précédente, ajoute un guillemet simple à celle-ci (\') puis commence une nouvelle chaîne simple. Cette syntaxe fonctionne avec tout descendant du shell Bourne, c'est assez facile à comprendre et la plupart des gens reconnaissent rapidement le motif.

L'alternative est de remplacer chaque guillemet simple par '"'"' ce qui se traduit par "terminer la chaîne simple actuelle, ajouter une chaîne double qui ne contient qu'un guillemet simple, redémarrer la chaîne simple". Cela évite le caractère d'échappement et a une apparence symétrique agréable. Cela fonctionne également dans l'autre sens si vous avez besoin d'un guillemet double dans une chaîne de guillemets doubles : "'"'".

-3voto

Vous ne trouverez pas de moyen plus rapide ou plus efficace que:

eval RESULT=\$\'$STRING\'

Pour commencer, c'est le genre de chose pour laquelle eval est là, et vous évitez le coût fou de la création de sous-processus partout, comme semblent le suggérer les réponses précédentes. Votre exemple:

$ foo='\u25b6'
$ eval bar=\$\'$foo\'
$ echo "$bar"
▶

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