Si vos options de saisie sont positionnelles (vous savez à quels endroits elles se trouvent), et non spécifiées avec des drapeaux, alors ce que vous voulez est simplement de construire la ligne de commande. Préparez simplement les arguments de commande pour chacun d'eux:
FLAG1="--flag1 $1"
FLAG2="--flag2 $2"
OPTFLAG1=""
OPTFLAG2=""
OPTFLAG3=""
if [ xFALSE != x"$3" ]; then
OPTFLAG1="--optflag1 $3"
fi
if [ xFALSE != x"$4" ]; then
OPTFLAG2="--optflag2 $4"
fi
#the same for other flags
#now just run the program
runprogram $FLAG1 $FLAG2 $OPTFLAG1 $OPTFLAG2 $OPTFLAG3
Si les paramètres ne sont pas spécifiés, les chaînes correspondantes sont vides et se développent en rien. Notez que dans la dernière ligne, il n'y a pas de guillemets. C'est parce que vous voulez que le shell divise les paramètres en mots (pour donner --flag1
et $1
comme arguments séparés à votre programme). Bien sûr, cela ira mal si vos paramètres d'origine contiennent des espaces. Si vous êtes celui qui exécute cela, vous pouvez le laisser, mais s'il s'agit d'un script général, il peut avoir un comportement inattendu si l'utilisateur entre quelque chose avec des espaces. Pour gérer cela, vous devrez rendre le code un peu plus laid.
Le x
préfixe du []
test est là au cas où $3
ou $4
est vide. Dans ce cas, bash se développerait [ FALSE != $3 ]
dans [ FALSE != ]
ce qui est une erreur de syntaxe, donc un autre caractère arbitraire est là pour se prémunir contre cela. C'est un moyen très courant, vous le verrez dans de nombreux scripts.
Je les ai définis OPTFLAG1
et les autres ""
au début juste pour être sûr (au cas où ils auraient été définis sur quelque chose auparavant), mais s'ils n'étaient pas réellement déclarés dans l'environnement, alors vous n'avez pas strictement besoin de le faire.
Quelques remarques supplémentaires:
- Vous pouvez en fait simplement recevoir les paramètres de la même manière que
runprogram
: avec des drapeaux. Voilà de quoi John N
parle. C'est là que getopts
devient utile.
- L'utilisation de FALSE à cette fin est un peu standard et assez longue. Habituellement, on utiliserait un seul caractère (éventuellement
-
) pour signaler une valeur vide, ou simplement passer une chaîne vide, comme ""
, si ce n'est pas autrement une valeur valide du paramètre. Une chaîne vide raccourcit également le test, il suffit de l'utiliser if [ -n "$3" ]
.
- S'il n'y a qu'un seul indicateur facultatif, ou s'ils sont dépendants, vous ne pouvez donc jamais avoir OPTFLAG2, mais pas OPTFLAG1, alors vous pouvez simplement ignorer ceux que vous ne souhaitez pas définir. Si vous utilisez
""
des paramètres vides, comme suggéré ci-dessus, vous pouvez de toute façon ignorer tous les vides de fin.
Cette méthode est à peu près la façon dont les options sont passées aux compilateurs dans Makefiles.
Et encore une fois - si les entrées peuvent contenir des espaces, cela devient moche.
getopts
c'est ce que tu veux. Sans cela, vous pourriez utiliser une boucle avec une instruction switch pour détecter chaque indicateur, facultatif ou non.