Voici une petite trame de code permettant de construire un script Bash prenant des options de type –opt -R -odp.
Ici, il s’agit, selon les options –help, –recursif, –class, –jar, –war et/ou selon leurs versions courtes -hRcjw, de renseigner les variables $RECURSIF, $RES, $CLASS, $JAR et $WAR.
let "lim=$#+1"
while [ $OPTIND != $lim ]
do
# Traite une suite d'option, modifie les valeurs des variables correspondant en conséquence.
while getopts "hRcjw-:" OPTION
do
# Si l'option est "-" c'est que l'option est de type --opt. Du coup, on isole la partie de OPTARG qui correspond au nom de l'option, c'est à dire ce qui est avant le "=" éventuel (et évidemment les "--" qui ne sont pas dans OPTARG). On teste sur cette base.
# Dans ${OPTARG%%=*} on supprime la plus grande occurence de "=*" Ã partir de la fin de OPTARG.
[ $OPTION = "-" ] && case "${OPTARG%%=*}" in
help) OPTION="h" ;;
recursif) OPTION="R" ;;
class) OPTION="c" ;;
jar) OPTION="j" ;;
war) OPTION="w" ;;
# Pour récupérer un vrai OPTARG au cas échéant :
# OPTARG="${OPTARG#*=}"
# On supprime la plus petite occurence de "*=" à partir du début de OPTARG.
# Pour résumer : avec la forme ${chaineXsous-chaine}
# X peut être de quatre formes :
# "%" supprime la plus petite occurence de sous-chaine à partir de la fin de chaine.
# "%%" plus grande occurence à partir de la fin.
# "#" plus petite occurence à partir du début.
# "##" plus grande occurence à partir du début.
esac
case $OPTION in
h)
usage
exit 1
;;
R)
RECURSIF=true
RES=$RES" récursif"
;;
c)
CLASS=true
RES=$RES" class"
;;
j)
JAR=true
RES=$RES" jar"
;;
w)
WAR=true
RES=$RES" war"
;;
?)
usage
exit
;;
esac
done
let "OPTIND++"
done
while [ $OPTIND != $lim ]
do
# Traite une suite d'option, modifie les valeurs des variables correspondant en conséquence.
while getopts "hRcjw-:" OPTION
do
# Si l'option est "-" c'est que l'option est de type --opt. Du coup, on isole la partie de OPTARG qui correspond au nom de l'option, c'est à dire ce qui est avant le "=" éventuel (et évidemment les "--" qui ne sont pas dans OPTARG). On teste sur cette base.
# Dans ${OPTARG%%=*} on supprime la plus grande occurence de "=*" Ã partir de la fin de OPTARG.
[ $OPTION = "-" ] && case "${OPTARG%%=*}" in
help) OPTION="h" ;;
recursif) OPTION="R" ;;
class) OPTION="c" ;;
jar) OPTION="j" ;;
war) OPTION="w" ;;
# Pour récupérer un vrai OPTARG au cas échéant :
# OPTARG="${OPTARG#*=}"
# On supprime la plus petite occurence de "*=" à partir du début de OPTARG.
# Pour résumer : avec la forme ${chaineXsous-chaine}
# X peut être de quatre formes :
# "%" supprime la plus petite occurence de sous-chaine à partir de la fin de chaine.
# "%%" plus grande occurence à partir de la fin.
# "#" plus petite occurence à partir du début.
# "##" plus grande occurence à partir du début.
esac
case $OPTION in
h)
usage
exit 1
;;
R)
RECURSIF=true
RES=$RES" récursif"
;;
c)
CLASS=true
RES=$RES" class"
;;
j)
JAR=true
RES=$RES" jar"
;;
w)
WAR=true
RES=$RES" war"
;;
?)
usage
exit
;;
esac
done
let "OPTIND++"
done