web-dev-qa-db-fra.com

Comment le signe dollar principal affecte-t-il les guillemets simples dans Bash?

J'ai besoin de passer une chaîne à un programme comme argument de la CLI Bash, par exemple

program "don't do this"

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

Cependant, ce qui suit ne fonctionne pas:

 program 'don\'t do this'            //escape doesn't work in single quote

Alors que les deux œuvres suivantes:

 program $'dont\'t do this'          //seems fine, but any other side effects?
 program 'dont'\''do this'           //breaking into 3 parts

La première approche semble meilleure en ce qu'elle acquiert moins de pré-modification (mettez le symbole du dollar devant et remplacez chaque \ à \\), mais je ne sais pas ce que le DOLLAR SIGN pourrait faire d'autre.

J'ai vraiment cherché sur Google, mais je ne trouve pas ce dont j'ai besoin ...

59
user1206899

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

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

(Et SO gère les onglets de manière maladroite, alors essayez celui-ci à la maison)

72

En utilisant $ en tant que préfixe indique à BASH d'essayer de trouver une variable portant ce nom. $' est une syntaxe spéciale ( expliquée en détail ici ) qui permet le traitement des chaînes ANSI-C. Dans ce cas, le tick unique n'est pas "prendre la valeur mot pour mot jusqu'au prochain tick". Il devrait être assez sûr à utiliser. Les inconvénients sont que c'est BASH seulement et assez rare, 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 '\''. Ceci termine la chaîne entre guillemets précédente, y ajoute une citation (\'), puis démarre une nouvelle chaîne entre guillemets simples. Cette syntaxe fonctionne avec n'importe quel descendant du Bourne Shell , elle est assez facile à comprendre et la plupart des gens reconnaissent rapidement le modèle.

L'alternative consiste à remplacer chaque tick par '"'"' qui se traduit par "terminer la chaîne entre guillemets actuelle, ajouter une chaîne entre guillemets qui ne contient qu'un seul tick, redémarrer la chaîne entre guillemets". Cela évite le caractère d'échappement et semble bien symétrique. Cela fonctionne également dans l'autre sens si vous avez besoin d'un guillemet double dans une chaîne entre guillemets doubles: "'"'".

23
Aaron Digulla