Le site repo
la commande ne peut pas se soucier du genre de citations qu'elle reçoit. Si vous avez besoin d'une expansion des paramètres, utilisez des guillemets doubles. Si cela signifie que vous devez mettre des barres obliques inversées pour un grand nombre de choses, utilisez des guillemets simples pour la plus grande partie, puis sortez de ces guillemets et passez aux guillemets doubles pour la partie où vous avez besoin que l'expansion se produise.
repo forall -c 'literal stuff goes here; '"stuff with $parameters here"' more literal stuff'
L'explication suit, si vous êtes intéressés.
Lorsque vous exécutez une commande à partir du shell, cette commande reçoit comme arguments un tableau de chaînes de caractères à terminaison nulle. Ces chaînes peuvent contenir absolument tout caractère non nul.
Mais lorsque l'interpréteur de commandes construit ce tableau de chaînes de caractères à partir d'une ligne de commande, il interprète certains caractères de manière spéciale ; ceci est conçu pour rendre les commandes plus faciles (voire possibles) à taper. Par exemple, les espaces indiquent normalement la limite entre les chaînes de caractères dans le tableau ; pour cette raison, les arguments individuels sont parfois appelés "mots". Mais un argument peut néanmoins contenir des espaces ; vous devez simplement trouver un moyen d'indiquer à l'interpréteur de commandes que c'est ce que vous voulez.
Vous pouvez utiliser une barre oblique inversée devant n'importe quel caractère (y compris l'espace, ou une autre barre oblique inversée) pour indiquer à l'interpréteur de commandes de traiter ce caractère littéralement. Mais alors que vous pouvez faire quelque chose comme ceci :
echo \”That\'ll\ be\ \$4.96,\ please,\"\ said\ the\ cashier
...cela peut devenir fastidieux. Le shell propose donc une alternative : les guillemets. Il en existe deux grandes variétés.
Les guillemets doubles sont appelés "guillemets de regroupement". Ils empêchent les caractères de remplacement et les alias d'être développés, mais ils servent surtout à 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 le signe $
) se produisent toujours. Et bien sûr, si vous voulez une double citation littérale à l'intérieur d'une double citation, vous devez la barrer :
echo "\"That'll be \$4.96, please,\" said the cashier"
Les guillemets simples sont plus draconiens. Tout ce qui se trouve entre eux est pris au pied de la lettre, y compris les antislashs. 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 ; à elles seules, elles ne terminent pas un mot. Vous pouvez entrer et sortir des guillemets, y compris entre différents types de guillemets, dans un même mot pour obtenir le résultat souhaité :
echo '"That'\''ll be $4.96, please," said the cashier'
C'est donc plus facile - beaucoup moins de barres obliques inversées, même s'il faut s'habituer à la séquence close-single-quote, backslashed-literal-single-quote, open-single-quote.
Les shells 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éfixé par un signe dollar. Les chaînes de caractères ainsi citées suivent des conventions similaires à celles des chaînes de caractères de la version standard ANSI du langage de programmation C, et sont donc parfois appelées "chaînes ANSI" et le symbole de la chaîne de caractères de la version ANSI. $'
... '
paire "guillemets ANSI". Dans ces chaînes de caractères, les conseils ci-dessus concernant les barres obliques inversées à prendre au pied de la lettre ne s'appliquent plus. Au contraire, ils redeviennent spéciaux - non seulement vous pouvez inclure un guillemet simple littéral ou une barre oblique inversée en lui faisant précéder d'une barre oblique inversée, mais l'interpréteur de commandes développe également les échappements de caractères ANSI C (tels que \n
pour un saut de ligne, \t
pour l'onglet, et \xHH
pour le caractère avec le code hexadécimal HH
). Sinon, cependant, ils se comportent comme des chaînes de caractères entre guillemets : aucune substitution de paramètre ou de commande n'a lieu :
echo $'"That\'ll be $4.96, please," said the cashier'
La chose importante à noter est que la chaîne unique reçue en tant qu'argument de la fonction echo
La commande est exactement la même chose dans tous ces exemples. Une fois que l'interpréteur de commandes a fini d'analyser une ligne de commande, il n'y a aucun moyen pour la commande exécutée de savoir ce qui a été cité et comment. Même si elle le voulait.
60 votes
repo forall -c ' ...before... '"$variable"' ...after...'
3 votes
@n.m. les guillemets simples font partie de la commande repo. je ne pense pas que cela fonctionnera.
1 votes
bash
mange des guillemets simples. Soit vous n'êtes pas dansbash
ou les guillemets simples ne font pas partie de l'adresse IP.repo
commandement.0 votes
Je ne suis pas sûr de comprendre, mais si les guillemets simples doivent être présents, repo forall -c "' ...before... "$variable" ...après...'" ne fonctionnerait-il pas ?
0 votes
C'est un bash script exécuté dans le shell bash et la commande repo forall prend des paramètres entre guillemets. Si je remplace la valeur réelle, la commande fonctionne bien.
0 votes
@Kevin. Non, il donne l'erreur suivante : 'before value after' : 'before value after' No such file or directory.
0 votes
Je me suis renseigné depuis. J'ai eu la chance d'avoir le repo qui traînait. Je ne sais toujours pas s'il est nécessaire de placer les commandes entre guillemets simples. J'ai regardé la syntaxe de repo et je ne pense pas que ce soit nécessaire. Vous pouvez utiliser des guillemets doubles autour de votre commande, puis utiliser les guillemets simples et doubles dont vous avez besoin à l'intérieur, à condition d'échapper aux guillemets doubles. Si vous pouviez me fournir le cas réel, je pense que je pourrais être d'une plus grande aide.
0 votes
BTW, vous l'exécutez peut-être à partir d'un shell bash/script, mais les commandes repo sont exécutées dans un shell sh, conformément à la documentation : "-c : commande et arguments à exécuter. La commande est évaluée à travers /bin/sh et tous les arguments après elle sont passés à travers comme des paramètres positionnels du shell." <- lien
0 votes
Une autre approche qui pourrait fonctionner serait de passer la variable nécessaire à l'exécution du repo, qui semble la diffuser avec succès dans les sh's créés. Comme ceci : variable=$variable ./repo forall -c 'blahblah $variable blahblah'. Les guillemets simples entourant la commande complète sont traités par repo, et $variable est réellement évalué.
0 votes
@Kevin : Oui, vous aviez raison. repo forall prend aussi les guillemets doubles au lieu des guillemets simples. Je suis stupide de ne pas l'avoir vérifié une fois. Merci pour votre aide. Si vous postez votre réponse, je l'accepterai comme correcte.
0 votes
@Kevin : J'ai également lu la documentation sur l'exécution et je pense que vous avez raison, mais je n'ai pas le temps de vérifier. Je vais utiliser des guillemets doubles. Merci beaucoup ! !!
0 votes
Voir : Différence entre les guillemets simples et doubles dans Bash .
0 votes
Et aussi plus largement Quand mettre des guillemets autour d'une variable shell ?