21 votes

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

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

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

Je l'aurais fait :

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

Quel est le moyen le plus simple d'obtenir "d'autres arguments ici", qui devraient être non traités par getopts ?

25voto

pogma Points 241

Que vous devez décaler lorsque vous analysez une arg, ou mettre

shift $((OPTIND -1)) après avoir terminé l'analyse, puis traitez 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

3 votes

Il est utile d'expliquer que $OPTIND est l'index de la prochaine option à considérer, après chaque exécution de getopts. Donc si $* contient 3 paramètres, après le premier appel valide, c'est 2, et après le second c'est 3. Si l'appel est invalide, il sera abandonné avec la valeur précédente. Donc si le paramètre 1 n'est pas valide, OPTIND sera 1 (donc l'exemple ci-dessus sera shift $(expr 1 - 1) ce qui est sûr.

3voto

Martin Murphy Points 1210

À la fin de l'analyse syntaxique, 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=$@

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X