La repo
commande ne se soucie pas du type de guillemets qu'elle obtient. Si vous avez besoin d'une extension de paramètre, utilisez des guillemets doubles. Si cela signifie que vous finissez par avoir à inverser beaucoup de choses, utilisez des guillemets simples pour la plupart, puis sortez-en et passez en double pour la partie où vous avez besoin de l'extension.
repo forall -c 'literal stuff goes here; '"stuff with $parameters here"' more literal stuff'
L'explication suit, si vous êtes intéressé.
Lorsque vous exécutez une commande à partir du shell, ce que cette commande reçoit comme arguments est un tableau de chaînes terminées par null. Ces chaînes peuvent contenir absolument tout caractère non nul.
Mais lorsque le shell construit ce tableau de chaînes à partir d'une ligne de commande, il interprète spécialement certains caractères; ceci est conçu pour rendre les commandes plus faciles (en fait, possibles) à taper. Par exemple, les espaces indiquent normalement la frontière entre les chaînes du tableau; pour cette raison, les arguments individuels sont parfois appelés «mots». Mais un argument peut néanmoins contenir des espaces; vous avez juste besoin d'un moyen de dire au shell que c'est ce que vous voulez.
Vous pouvez utiliser une barre oblique inverse devant n'importe quel caractère (y compris l'espace ou une autre barre oblique inverse) pour indiquer au shell de traiter ce caractère littéralement. Mais alors que vous pouvez faire quelque chose comme ça:
echo \"Thank\ you.\ \ That\'ll\ be\ \$4.96,\ please,\"\ said\ the\ cashier
... ça peut devenir ennuyeux. Le shell propose donc une alternative: les guillemets. Ceux-ci se déclinent en deux variétés principales.
Les guillemets doubles sont appelés "guillemets de regroupement". Ils empêchent les caractères génériques et les alias d'être étendus, mais ils visent principalement à inclure des espaces dans un mot. D'autres choses comme l'expansion des paramètres et des commandes (le genre de choses signalées par a $
) se produisent toujours. Et bien sûr, si vous voulez un guillemet double littéral à l'intérieur des guillemets doubles, vous devez le contre-obliquer:
echo "\"Thank you. That'll be \$4.96, please,\" said the cashier"
Les guillemets simples sont plus draconiens. Tout entre eux est pris complètement à la lettre, y compris les contre-obliques. Il n'y a absolument aucun moyen d'obtenir un guillemet simple littéral à l'intérieur de guillemets simples.
Heureusement, les guillemets dans le shell ne sont pas des délimiteurs de mots ; par eux-mêmes, ils ne terminent pas un mot. Vous pouvez entrer et sortir des guillemets, y compris entre différents types de guillemets, dans le même mot pour obtenir le résultat souhaité:
echo '"Thank you. That'\''ll be $4.96, please," said the cashier'
C'est donc plus facile - beaucoup moins de barres obliques inverses, bien que la séquence close-single-quote, backslashed-literal-single-quote, open-single-quote prend un certain temps pour s'y habituer.
Les coques modernes ont ajouté un autre style de citation non spécifié par la norme POSIX, dans lequel le guillemet simple de tête est précédé d'un signe dollar. Les chaînes ainsi citées suivent des conventions similaires aux littéraux de chaîne dans le langage de programmation ANSI C, et sont donc parfois appelées "chaînes ANSI" et la paire $'
... '
"guillemets ANSI". Dans de telles chaînes, les conseils ci-dessus sur les contre-obliques qui sont pris littéralement ne s'appliquent plus. Au lieu de cela, ils redeviennent spéciaux - non seulement vous pouvez inclure un guillemet simple littéral ou une barre oblique inverse en lui ajoutant une barre oblique inverse, mais le shell étend également les échappements de caractères ANSI C (comme \n
pour une nouvelle ligne, \t
pour tabulation et \xHH
pour le caractère avec code hexadécimalHH
). Sinon, cependant, ils se comportent comme des chaînes entre guillemets simples: aucune substitution de paramètre ou de commande n'a lieu:
echo $'"Thank you. That\'ll be $4.96, please," said the cashier'
La chose importante à noter est que la chaîne unique reçue comme argument de la echo
commande est exactement la même dans tous ces exemples. Une fois que le shell a fini d'analyser une ligne de commande, il n'y a aucun moyen pour la commande en cours d'exécution de dire ce qui a été cité. Même s'il le voulait.
repo forall -c ' ...before... '"$variable"' ...after...'