Jump to content

[RESOLU][BASH] Passer un nombre variable de params


Recommended Posts

Bonjour à tous,

Ce qui m'amène à poster ici est un problème pas bien méchant (enfin je pense), mais qui me tape sérieusement sur le système car le moins que je puisse dire, c'est que je ne comprend pas pourquoi bash réagit de la sorte.

Donc, j'ai actuellement un set de scripts me permettant d'automatiser certaines tâches dans le cadre de la création d'extensions Firefox. Ces derniers marchent très bien mais je me suis dit que ça pourrait être sympa s'ils pouvaient en quelque sorte être "centralisés", c'est-à-dire qu'en fait je puisse faire appel à tous via un seule commande qui sert en gros de façade (je me suis en fait un peu inspiré du fonctionnement du script generate utilisé avec Rails). Le problème, c'est que mes différents scripts prennent un nombre différent de paramètres.

Dans une première version (naïve), je passais au script appelé $1 $2... $n, où n est le nombre de paramètres maximal que mon script est amené à rencontrer. Mais alors tous les scripts appelés considéraient reçevoir n paramètres (quand bien même une grande partie voire tous sont vide). Et comme la manière dont ils sont codés fait qu'ils refusent de s'exécuter s'ils n'ont pas pile poil le bon nombre de paramètres (entre autres vérifications), ça ne fonctionnait évidemment pas. J'ai donc décidé d'essayer de leur faire passer juste le nombre de paramètres qui étaient fournis au script appelant.

Ça a demandé un petit peu de recherche et de travail, mais j'ai fini par avoir un code fonctionnel qui marche presque comme je le veux. Voilà des scripts simples montrant ce que je fais actuellement :

#!/bin/bash
# script1

# Recovering parameters
i=2
if [ $# -gt 0 ]
then
   params="\"$1\""
fi
while [ $i -le $# ]
do
   eval j=\$$i
   params="$params \"$j\""
   i=$[$i+1]
done

echo Appel : script2 $params
script2 $params

#!/bin/bash
# script2
echo Nb params : $#
echo Params : $@

Si je le lance, voici ce que ça donne :

$ script1 "test" the test
Appel : script2 "test" "the" "test"
Nb params : 3
Params : "test" "the" "test"

La raison pour laquelle tout se retrouve entre double-quotes est que je souhaite protéger les espaces, qui sont autorisés dans les paramètres de mes scripts. Le premier problème ici est que les double-quotes, si tout fonctionnait bien, ne devraient pas apparaître à la dernière ligne. Elles sont considérés comme des caractères faisant partie des paramètres, ce qu'il fait que les espaces ne sont pas protégés, comme le montre cet autre exemple :

$: script1 "test the test"
Appel : script2 "test the test"
Nb params : 3
Params : "test the test"
$: script2 "test the test"
Nb params : 1
Params : test the test

On voit bien qu'avec script1, "test est le premier paramètre, the le second et test" le troisième.

J'avais aussi essayé de protéger les espaces avec un anti-slash plutôt que d'entourer les paramètres de double-quotes (ou des simples), avec le même succès. Le problème vient sans doute de la manière dont je construis ma chaîne $params, mais je n'arrive pas à savoir ce qui ne va pas.

Donc si effectivement quelqu'un sait le pourquoi du problème, ça m'aiderait pas mal. Et puis sans doute aussi les personnes qui passeraient par ici et seraient amenées à réutiliser le code corrigé.

Merci d'avance.

Link to comment
Share on other sites

Finalement j'ai trouvé la réponse à mon problème. En fait, pour récupérer tous les paramètres en conservant les mots groupés quand nécessaire, il suffit d'appeler la variable spéciale "$@" (avec les doubles quotes). Et si l'on ne veut récupérer les paramètres qu'à partir du second ou plus loin, il suffit d'appeler l'instruction shift autant de fois que nécessaire.

Donc le bout de code avec le while et les autres variables est totalement inutile en fait.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...