#!/bin/bash # Paramètres "short" (-p) avec la build-in getopts help_msg () { echo "Usage: $(basename $0) [-h] [-v] [-a PARAM_A] [-b PARAM_B] [-o]" echo 'Description' echo ' -h display this help' echo ' -v verbose' echo ' -a PARAM_A Le paramètre A' echo ' -b PARAM_B Le paramètre B' echo ' -o option OPTION_O' } verbose_print () { # remplace un printf par un printf + condition local MESSAGE="${@}" if [[ "${VERBOSE}" == true ]];then # à condition que la variable globale $VERBOSE soit à true printf "${MESSAGE}\n" fi } # Si aucun argument donné, on affiche l'aide if [[ ${#} -eq 0 ]]; then help_msg exit 1 fi # Définition des paramètres optstring=":hva:b:o" # getopts cherchera les paramètres listés ('-h', 'v', 'a',...) # et attendra une valeur pour ceux suivis d'un ':' (-a value_a) # Voici la liste des variables utilisées par getopts : # OPTIND => index de l'argumetn # OPTARG => valeur de l'option si définie ( -a option => OPTARG="option" ) # OPTERR => 0 ou 1, si egal à 1, bash affiche les messages d'erreur (à 1 par défaut en début de boucle) OPTION_O=false # itère sur les paramètres type "-p", while getopts ${optstring} arg ; do # ne prend pas en compte les positionnel (arg) # ! le type long (--long) n'est pas accepté => cas '?)' case ${arg} in h) # Si $arg contient la valeur "h" help_msg exit 0 # Quitte sans erreur ;; # fin du test, ne teste pas les arguments suivant => retour en début de boucle v) VERBOSE='true' # variable globale à true (lue dans verbose_print) verbose_print "Mode prolixe activé." ;; a) # Si $arg contient la valeur "a" PARAM_A="${OPTARG}" # getopts a défini la variable $OPTARG qui contient le paramètre succédant à "-a" ;; b) PARAM_B="${OPTARG}" # même chose ;; o) OPTION_O='true' # On ne demande pas de valeur, on passe simplement la variable à true si l'option est présente ;; ?) # l'arugment n'a pas été défini echo "Option invalide: -${OPTARG}." echo help_msg echo ;; esac done printf "a=$PARAM_A \nb=$PARAM_B \noption_o=$OPTION_O\n" verbose_print "\nMessage si et seulement si drapeau '-v'"