Comment puis-je obtenir les arguments restants après avoir retiré les éléments analysés à l'aide de getopts?

14

Je veux analyser certains arguments d'un script bash en utilisant getopts mais je veux pouvoir accéder aux arguments restants qui ne sont pas inclus dans la liste d'options. Ainsi, par exemple, si j'ai un appel:

% script -a -b param -c param -d other arguments here

J'aurais:

while getopts "ab:c:d" opt ; do
.
done

Quelle est la façon la plus simple d'obtenir "d'autres arguments ici", qui ne devraient pas être traités par les getopts?

Tim
la source

Réponses:

17

vous devez déplacer lorsque vous analysez un argument, ou mettez

déplacer $ ((OPTIND -1)) après avoir terminé l'analyse, puis traiter de la manière habituelle, par exemple

while getopts "ab:c:d" opt ; do
.
done
shift $(expr $OPTIND - 1 )

while test $# -gt 0; do
  echo $1
  shift
done
pogma
la source
1
Il vaut la peine d'expliquer que $ OPTIND est l'indice de la prochaine option à considérer, après l'exécution de chaque getopts. Par conséquent, $ * contient 3 paramètres, après le premier appel valide, c'est 2 et le second, c'est 3. Si l'appel est invalide, il abandonnera avec la valeur précédente. Donc, si le paramètre 1 n'est pas valide, OPTIND sera 1 (d'où l'exemple ci-dessus shift $(expr 1 - 1)qui est sûr.
sibaz
0

À la fin de l'analyse, une fois que vous avez déplacé la variable $ @ contient la fin de la ligne:

while getopts "ab:c:d" opt ; do
.
done
shift $((OPTIND-1))
OTHERARGS=$@
Bruno Mairlot
la source