bash getopts avec plusieurs options obligatoires

est-il possible d'utiliser getopts pour traiter plusieurs options ensemble? Par exemple, myscript-iR ou myscript-irv.

en outre, j'ai une situation où basé sur un script de condition devrait option obligatoire. Par exemple, si argument to script est un répertoire, je devrai spécifier l'option-R ou-r avec toutes les autres options (myscript-iR mydir ou myscript-ir mydir ou myscript-i-r mydir ou myscript-i-R mydir), en cas de fichier seulement -i est suffisant (myscript-i myfile).

j'ai essayé de chercher mais je n'ai pas eu de réponses.

29
demandé sur Paul T. 2012-07-01 07:50:52

1 réponses

Vous pouvez concaténer les options que vous fournissez et getopts va les séparer. Dans votre case énoncé vous traiterez chaque option individuellement.

vous pouvez mettre un drapeau quand les options sont vues et vérifier pour s'assurer que les "options" obligatoires (!) sont présents après le getopts boucle terminée.

Voici un exemple:

#!/bin/bash
rflag=false
small_r=false
big_r=false

usage () { echo "How to use"; }

options=':ij:rRvh'
while getopts $options option
do
    case $option in
        i  ) i_func;;
        j  ) j_arg=$OPTARG;;
        r  ) rflag=true; small_r=true;;
        R  ) rflag=true; big_r=true;;
        v  ) v_func; other_func;;
        h  ) usage; exit;;
        \? ) echo "Unknown option: -$OPTARG" >&2; exit 1;;
        :  ) echo "Missing option argument for -$OPTARG" >&2; exit 1;;
        *  ) echo "Unimplemented option: -$OPTARG" >&2; exit 1;;
    esac
done

shift $(($OPTIND - 1))

if ! $rflag && [[ -d  ]]
then
    echo "-r or -R must be included when a directory is specified" >&2
    exit 1
fi

ceci représente une implémentation de référence complète d'un getopts fonction, mais n'est qu'un croquis d'un plus grand script.

78
répondu Dennis Williamson 2013-12-13 14:12:57