Gestion de parametres complexe

Et voilà encore une fois je me suis retrouvé à passer des heures sur des traîtements de condition à la …

je voudrais un script qui aît cette forme:

commande [option] -k -n

avec comme contrainte : -k et -n facultatif mais commandant des blocs devant être excécuté avant ceux commandé par [option]

je me suis naturellement tourné vers un truc du genre :

[code]while getopts “kn” option
do
case $option in
k)
echo “option k”
;;
n)
echo “option n”
;;
*)
echo “pas de parametre”
;;
esac
done

case $1 in
normal)
echo “option normal”
;;
boot)
echo “option boot”
;;
*)
echo “pas d’option”
;;
esac[/code]

ça marche pas et ça commence à me … bon enfin je sais pas comment faire…
Et les contraintes évoquées ne permettent pas de faire le test case des options avant le getopts des parametres car sinon l’éxecution ne se passe pas dans le bon ordre…

une idée ?

C’est pas très clair. boot/normal sont facultatifs eux aussi ?

De manière générale, quand les options à traiter deviennent un peu complexes il vaut mieux procéder en deux temps :

  1. vérifier TOUTES les options d’abord (tu stockes le résultat de tes vérifications dans des variables), pour pouvoir arrêter le script et afficher un message d’erreur sans avoir effectué aucune action sur le système
  2. une fois les options validées, exécuter les actions prévues

Là tu mélanges les deux, tu es donc susceptible d’exécuter les actions correspondant à -k et -n même si ton option boot/normal est erronée.

Sinon, techniquement ce que tu cherches c’est la commande shift qui “enlève” le premier paramètre de la liste des paramètres d’entrée… ($2 devient $1, $3 devient $2 etc).

[code]case “$1” in
boot|normal)
ACTION="$1"
shift
;;
*)
# bien entendu les deux blocs ci-dessous sont mutuellement exclusifs, faut en choisir un seul

# si l'option boot/normal est obligatoire, on affiche un message d'erreur et on quitte :
echo >&2 "Usage: $(basename "$0") ACTION [-k] [-n]"
echo >&2 "       où ACTION peut valoir «boot» ou «normal»"
exit 1

# si l'option boot/normal est facultative, on renseigne simplement la variable ACTION et on continue
ACTION=""
;;

esac

OPTION_K=0
OPTION_N=0
while getopts “kn” OPTION; do
case “$OPTION” in
k)
OPTION_K=1
;;
n)
OPTION_N=1
;;
esac
done

c’est juste un exemple de vérification, pas forcément pertinent pour ton cas

if [ “$OPTION_K” = 0 ] && [ “$OPTION_N” = 0 ]; then
echo >&2 "Erreur : -k ou -n doivent être utilisés."
exit 1
elif [ “$OPTION_K” = 1 ] && [ “$OPTION_N” = 1 ]; then
echo >&2 "Erreur : -k et -n ne peuvent pas être utilisés ensemble."
exit 1
fi

à partir d’ici tes options sont vérifiées, tu peux les traiter dans l’ordre que tu veux

(en basant tes tests sur les variables, pas sur les paramètres d’entrée)

[…][/code]

:041 :041

Franchement merci !!!
J’ai pas encore testé mais c’est très clair comme explication!! Effectivement tout tester d’abord c’est tellement plus simple!

bonjour,

pour [option], est-il possible qu’il y ait plus valeur en même temps ? Auquel cas, si quel critère itératif arrêteras-tu de faire un shift ?

Une autre méthode est d’utiliser le formalisme des paramétres “long”. i.e --param1, --param2

Ainsi, il est possible de les traiter avec getopts comme ceci :

optN=false
optK=false
actParam1=false
actParam2=false
while getopts :-:kn option
do
  case "${option}" in
    k) optK=true;;
    n) optN=true;;
    -) case "${OPTARG}" in
         -param1) actParam1=true;;
         -param2) actParam2=true;;
         *) echo >&2 "Action non valide : -${OPTARG}."; exit 1;;
       esac;;
    :) echo >&2 "Argument manquant pour l'option '${OPTARG}'"; exit 1;;
    ?) echo >&2 "Option non valide : ${OPTARG}."; exit 1;;
  esac
done