Quelle est la différence entre $ 'string' entre guillemets simples et $ “string” entre guillemets doubles dans bash?

9

J'essayais d'exécuter une nouvelle ligne en utilisant echoet j'ai essayé de suivre deux commandes:

  1. Première commande:

    echo $'Hello World\nThis is a new line'

    Réponse:

    Hello World
    This is a new line
  2. Deuxième commande:

    echo $"Hello World\nThis is a new line"

    Réponse:

    Hello World\nThis is a new line

Ma question est quelle est la différence entre chaîne enveloppé avec $' 'vs chaîne enveloppé avec $" "dans bash« s echo?

Rafaf Tahsin
la source
Remarque utile: les guillemets doubles sont également appelés guillemets faibles et les guillemets simples sont également appelés guillemets forts.
Rafaf Tahsin
2
Oui, mais "weak quote"et 'strong quote'sont différents de $'C String'et $"I18N String".
DopeGhoti
Vous le vrai MVP. : D >>> @DopeGhoti
Rafaf Tahsin
Je fais ce que je peux (:
DopeGhoti

Réponses:

10

Comme expliqué ici , la syntaxe $'string'spécifie une chaîne de style C qui inclut des caractères d'échappement magiques, comme \npour une nouvelle ligne. $"string"est pour l'extension I18N, qui n'a pas de telles évasions magiques.

Notez que ceux-ci sont distincts des plus courants "string"(cotation faible) et 'string'(cotation forte).

DopeGhoti
la source
9

Le $au début de la chaîne dans:

echo $'Hello World\nThis is a new line'

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

Manuel de référence Bash [dit]

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. ..
..
Le résultat étendu est guillemet simple, comme si le signe dollar n'était pas présent.

Mais

echo $"Hello World\nThis is a new line"

est complètement différent. Cet [article] sur la traduction spécifique aux paramètres régionaux dit:

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.


Remarque: IIRC à la fois $'string'et $"string"peut ne pas trouver de support entre différents obus. Non seulement les gens d'autres shells les regardent avec curiosité, mais ils discutent également de savoir si cela pourrait être évité pour la portabilité des scripts.

sjsam
la source
1
ksh93comprend également $'...'.
Kusalananda
@Kusalananda: Hmm, bonne note :)
sjsam
4
$'xxx'n'est pas un bashisme mais a été introduit pour la première fois kshplusieurs années auparavant bash. Il est actuellement également pris en charge par zshet busybox shest en cours d'examen par la norme POSIX.
jlliagre
@jlliagre: Appréciez le temps :). Je me tiens corrigé ..
sjsam