web-dev-qa-db-fra.com

Qu'est-ce que cela signifie d'avoir une "chaîne de préfixe de signe dollar" dans un script?

Je viens de voir cela dans un script d'initialisation:

echo $"Stopping Apache"

À quoi sert ce signe dollar?

Mes recherches jusqu'à présent:

J'ai trouvé cela dans le manuel bash:

extquote

Si défini, $'string' et $"string" la citation est effectuée dans ${parameter} extensions entre guillemets. Cette option est activée par défaut.

... mais je ne trouve aucune différence entre les chaînes avec et sans le $ préfixe:

$ echo "I am in $PWD"
I am in /var/shared/home/southworth/qed
$ echo $"I am in $PWD"
I am in /var/shared/home/southworth/qed
$ echo $"I am in ${PWD}"
I am in /var/shared/home/southworth/qed
$ echo "I am in ${PWD}"
I am in /var/shared/home/southworth/qed
$ echo 'I am in ${PWD}'
I am in ${PWD}
$ echo $'I am in ${PWD}'
I am in ${PWD}
$ echo $'I am in $PWD'
I am in $PWD
85
Ed Brannin

Il se passe deux choses différentes ici, toutes deux documentées dans le manuel bash

$ '

Le guillemet simple à signe dollar est une forme spéciale de citation:

Citation ANSI C

Les mots de la forme $ 'string' sont traités spécialement. Le mot se développe en chaîne, avec des caractères d'échappement antislash remplacés comme spécifié par la norme C ANSI.

$ "

La citation double du signe dollar sert à la localisation:

traduction locale

Une chaîne entre guillemets précédée d'un signe dollar ("$") entraînera la traduction de la chaîne en fonction des paramètres régionaux actuels. Si les paramètres régionaux actuels sont C ou POSIX, le signe dollar est ignoré. Si la chaîne est traduite et remplacée, le remplacement est entre guillemets.

116
jw013

Lorsqu'une chaîne est développée à l'intérieur de $'', les séquences d'échappement sont interprétées. Depuis la page de manuel:

Words of the form $'string' are treated specially. The Word expands to
string, with backslash-escaped characters replaced as specified by  the
ANSI  C  standard.

Un exemple simple est la séquence d'échappement\n pour une nouvelle ligne:

$ echo 'foo\n'
foo\n
$ echo $'foo\n'
foo

$ 

Remarque: Vous pouvez obtenir des résultats différents dans d'autres shells car echo peut interpréter des séquences d'échappement sans fournir d'options.

24
jordanm