Comment puis-je utiliser longs avec le Bash getopts builtin?
Je suis en train d'analyser un -temp
option avec Bash getopts. Je vais appeler mon script comme ceci:
./myscript -temp /foo/bar/someFile
Voici le code que j'utilise pour analyser les options.
while getopts "temp:shots:o:" option; do
case $option in
temp) TMPDIR="$OPTARG" ;;
shots) NUMSHOTS="$OPTARG" ;;
o) OUTFILE="$OPTARG" ;;
*) usage ;;
esac
done
shift $(($OPTIND - 1))
[ $# -lt 1 ] && usage
- Double Possible de Comment dois-je analyser les arguments de ligne de commande de Bash?
Vous devez vous connecter pour publier un commentaire.
getopts
peut analyser uniquement à court d'options.La plupart des systèmes ont également un externe
getopt
de commande, mais getopt n'est pas standard, et est généralement cassé par la conception qu'il ne peut pas gérer tous les arguments en toute sécurité (arguments avec des espaces blancs et vides d'arguments), seulement GNU getopt peut les manipuler en toute sécurité, mais seulement si vous utilisez la version GNU de manière spécifique.Le choix le plus facile est d'utiliser non plus, juste répéter les arguments du script avec un tout-boucle et de faire l'analyse de vous-même.
Voir http://mywiki.wooledge.org/BashFAQ/035 pour un exemple.
Que d'autres personnes ont expliqué, getopts ne pas analyser à long options. Vous pouvez utiliser getopt, mais ce n'est pas portable (et il est cassé sur certaines plate-forme...)
Comme une solution de contournement, vous pouvez mettre en œuvre une boucle shell. Voici un exemple qui transforme longue options pour le court avant d'utiliser le standard de la commande getopts (c'est plus simple à mon avis):
illegal option -- -
. J'ai ajouté ce qui suit à mon script à l'aide:"--"*) usage ${arg}; exit 2;;
--
style. Nice!getopts
est utilisé par le shell procédures pour analyser les paramètres positionnels de 1 caractère(pas de style GNU longue options (--mon option) ou XF86-style long options (mon option))
Bien que cette question a été posté il y a 2 ans, j'ai trouvé moi-même ayant besoin d'un soutien pour XFree86-style long options de trop; et je voulais également profiter de ce que j'ai pu de getopts. Envisager la GCC commutateur
-rdynamic
. Je marquer
que le drapeau de la lettre, et s'attendre àdynamic
dans$OPTARG
...mais, je veux rejeter-r dynamic
, tout en acceptant l'autre des options suivantesr
.L'idée que j'ai mis ci-dessous s'appuie sur l'observation que
$OPTIND
sera l'un plus que l'autre si l'espace (un espace) suit le drapeau. Donc, je définir un bash variable pour stocker la valeur précédente de$OPTIND
, appelé$PREVOPTIND
, et de mettre à jour à la fin de lawhile
boucle. Si$OPTIND
est1
plus de$PREVOPTIND
, nous n'avons pas d'écart (c'est à dire-rdynamic
); et$GAP
est fixé àfalse
. Si, au lieu$OPTIND
est2
plus de$PREVOPTIND
, nous ne ont un intervalle (par exemple,-r dynamic
), et$GAP
est fixé àtrue
.la façon la plus simple d'y parvenir est avec l'aide de getopt et --longoptions
essayer , j'espère que cela est utile
et c'est de cette façon - vous appeler le script shell
Vous ne pouvez pas utiliser la getopts Bash builtin pour de longues options--au moins, pas sans avoir à construire votre propre analyse des fonctions. Vous devriez jeter un oeil à la /usr/bin/getopt binaire à la place (sur mon système par le util-linux paquet, votre kilométrage peut varier).
Voir getopt(1) pour l'invocation d'options.
/usr/bin/getopt
soutient de longue options.C'est vrai que builtin bash
getopts
analyser uniquement les fichiers à court d'options,mais vous pouvez toujours ajouter quelques lignes de script de getopts de poignées options.
Ici est une partie de code trouvé dans http://www.uxora.com/unix/shell-script/22-handle-long-options-with-getopts
Voici un test:
Sinon au cours des dernières Korn Shell ksh93,
getopts
peut naturellement analyser longs et même afficher une page de man de même. (voir http://www.uxora.com/unix/shell-script/20-getopts-with-man-page-and-long-options)Michel VONGVILAY.
grâce à @mcoolive .
J'ai été en mesure d'utiliser votre $@ idée de convertir le mot entier et longs à la seule lettre d'options. Voulais remarque à quelqu'un à l'aide de cette idée que j'avais aussi inclure
shift $(expr $OPTIND - 1)
avant l'exécution de l'argumentation à travers la getopts boucle.Totalement différentes fins, mais c'est bien le travail.
Un simple BRICOLAGE si vous avez des ennuis pour utiliser le haut -
getopts
:Utilisation:
Script: