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…
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 :
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
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)