110 votes

Comment conserver les citations dans les arguments de Bash ?

J'ai un Bash script où je veux garder les guillemets dans les arguments passés.

Ejemplo:

./test.sh this is "some test"

je veux ensuite utiliser ces arguments, et les réutiliser, en incluant des guillemets autour de toute la liste des arguments.

J'ai essayé d'utiliser \"$@\" mais cela supprime les guillemets à l'intérieur de la liste.

Comment puis-je y parvenir ?

1voto

Lars Points 751

Comme Gary S. Weaver l'a montré dans ses conseils sur le code source, l'astuce consiste à appeler bash avec le paramètre '-c', puis à citer le suivant.

par exemple

bash -c "<your program> <parameters>"

ou

docker exec -it <my docker> bash -c "$SCRIPT $quoted_args"

1voto

Vasya Novikov Points 1670

Si vous avez besoin de passer tous les arguments à bash à partir d'un autre langage de programmation (par exemple, si vous voulez exécuter bash -c o emit_bash_code | bash ), utilisez ceci :

  • échappez tous les caractères guillemets simples que vous avez avec '\'' .
  • puis, entourez le résultat de guillemets singuliers

L'argument de abc'def sera donc converti en 'abc'\''def' . Les personnages '\'' sont interprétés comme suit : les guillemets existants sont terminés par le premier guillemet anglais, puis par le guillemet singulier échappé. \' vient, puis la nouvelle citation commence.

0voto

Tom Orsi Points 51

Oui, il semble qu'il ne soit pas possible de conserver les guillemets, mais pour le problème que je traitais, ce n'était pas nécessaire.

J'ai une fonction bash qui va chercher dans le dossier récursivement et grep pour une chaîne, le problème est de passer une chaîne qui a des espaces, comme "trouver cette chaîne". En passant ceci au bash script prendra alors l'argument de base $n et le passera à grep, ceci a grep croyant que ce sont des arguments différents. La façon dont j'ai résolu cela en utilisant le fait que lorsque vous citez bash pour appeler la fonction, il regroupe les éléments entre les guillemets en un seul argument. J'avais juste besoin de décorer cet argument avec des guillemets et de le passer à la commande grep.

Si vous savez quel argument vous recevez dans bash qui a besoin de citations pour son étape suivante, vous pouvez simplement décorer avec des citations.

-18voto

yuku Points 15705

Il suffit d'utiliser des guillemets simples autour de la chaîne avec les guillemets doubles :

./test.sh this is '"some test"'

Ainsi, les guillemets doubles à l'intérieur des guillemets simples ont également été interprétés comme des chaînes de caractères.

Mais je recommande de mettre toute la chaîne entre guillemets simples :

 ./test.sh 'this is "some test" '

Afin de comprendre ce que le shell fait ou plutôt interprète les arguments dans les scripts, vous pouvez écrire un petit scripts comme ceci :

#!/bin/bash

echo $@
echo "$@"

Ensuite, vous verrez et testerez ce qui se passe lorsque vous appelez un script avec différentes chaînes de caractères.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X