Il y a une getopt
commande en ligne de commande bash. getopt
peut être utilisé avec des options courtes (telles que getopt -o axby "$@"
) et peut être utilisé avec des options courtes et longues (telles que getopt -o axby -l long-key -- "$@"
), mais maintenant je n'ai besoin que d' options longues (c'est-à-dire que les options courtes n'existent pas du tout), mais la commande getopt -l long-key -- "$@"
ne fonctionne pas analyser --long-key
correctement l'option. Alors, comment puis-je utiliser la getopt
commande avec seulement des options longues? Ou est-ce impossible ou est-ce simplement un bug de la getopt
commande?
13
getopts
, mais vous utilisez la/usr/bin/getopt
commande.Réponses:
getopt
est parfaitement bien sans avoir d'options courtes. Mais vous devez lui dire que vous n'avez pas d'options courtes. C'est une bizarrerie dans la syntaxe - du manuel:C'est ce qui se passe dans votre test:
getopt -l long-key -- --long-key foo
traite--long-key
comme la liste des options-egklnoy
etfoo
comme seul argument. Utilisationpar exemple
la source
getopts
ilgetopt
infecté votre réponse? Vous commencez par commentergetopts
puis ne mentionnez quegetopt
.getopt
programme de GNU coreutils, c'est de cela qu'il s'agit. J'ai corrigé le texte qui disaitgetopts
. Merci.getopts
ne fait même pas d'options longues, donc rien de tout cela ne s'appliqueraitgetopts
.getopts
étiquette. Je ne voulais pas changer votre réponse, parce que vous savez normalement beaucoup mieux que moi de quoi vous écrivez :-)Je ne sais pas
getopt
mais la fonctiongetopts
intégrée ne peut être utilisée que pour gérer de longues options comme ceci:Bien sûr, en l'état, cela ne fonctionne pas si les options longues sont censées avoir des arguments. Cela peut être fait, cependant, mais, comme je l'ai appris en travaillant là-dessus. Bien que je l'ai initialement inclus ici, j'ai réalisé que pour les options longues, il n'avait pas beaucoup d'utilité. Dans ce cas, cela ne faisait que raccourcir mes
case
(match)
champs d'un seul caractère prévisible. Maintenant, ce que je sais, c'est qu'il est excellent pour les options courtes - il est plus utile lorsqu'il fait une boucle sur une chaîne de longueur inconnue et sélectionne des octets uniques en fonction de sa chaîne d'options. Mais lorsque l'option est l'argument, vous ne faites pas grand-chose avec unefor var do case $var in
combinaison qu'elle pourrait faire. Il vaut mieux, je pense, rester simple.Je soupçonne qu'il en va de même,
getopt
mais je n'en sais pas assez pour le dire avec certitude. Étant donné le tableau d'arguments suivant, je vais démontrer mon propre petit analyseur d'arguments - qui dépend principalement de la relation d'évaluation / affectation que j'ai appris à apprécier pouralias
et$((shell=math))
.C'est la chaîne d'argument avec laquelle je vais travailler. Maintenant:
Cela traite le tableau arg de deux manières différentes selon que vous lui remettez un ou deux ensembles d'arguments séparés par le
--
délimiteur. Dans les deux cas, il s'applique aux séquences de traitement du tableau arg.Si vous l'appelez comme:
Son premier ordre du jour sera d'écrire sa
acase()
fonction pour ressembler à:Et à côté de
shift 3
. La substitution de commande dans laacase()
définition de la fonction est évaluée lorsque le shell appelant crée les documents d'entrée de la fonction ici, maisacase()
n'est jamais appelée ou définie dans le shell appelant. Il est appelé dans le sous-shell, bien sûr, et donc de cette façon, vous pouvez spécifier dynamiquement les options d'intérêt sur la ligne de commande.Si vous lui donnez un tableau non délimité, il remplit simplement
acase()
avec des correspondances pour tous les arguments commençant par la chaîne--
.La fonction effectue pratiquement tout son traitement dans le sous-shell - sauvegarde itérativement chacune des valeurs de l'argument dans des alias attribués avec des noms associatifs. Une
alias
fois terminé, il imprime toutes les valeurs enregistrées avec - qui est spécifié par POSIX pour imprimer toutes les valeurs enregistrées citées de telle manière que leurs valeurs puissent être réintroduites dans le shell. Alors quand je fais ...Sa sortie ressemble à ceci:
En parcourant la liste d'arguments, il vérifie la correspondance avec le bloc de cas. S'il y trouve une correspondance, il lance un drapeau -
f=optname
. Jusqu'à ce qu'il trouve à nouveau une option valide, il ajoutera chaque argument suivant à un tableau qu'il construit en fonction de l'indicateur actuel. Si la même option est spécifiée plusieurs fois, les résultats sont composés et ne remplacent pas. Tout ce qui n'est pas au cas où - ou tout argument suivant des options ignorées - est affecté à un tableau ignoré .La sortie est protégée par le shell pour une entrée de shell automatiquement par le shell, et donc:
... devrait être parfaitement sûr. Si, pour une raison quelconque, il n'est pas sûr, vous devez probablement déposer un rapport de bogue auprès de votre responsable du shell.
Il attribue deux types de valeurs d'alias pour chaque correspondance. Tout d'abord, il définit un indicateur - cela se produit, qu'une option précède ou non les arguments non correspondants. Ainsi, toute occurrence de
--flag
dans la liste arg se déclencheraflag=1
. Cela n'aggrave pas ---flag --flag --flag
obtient justeflag=1
. Cette valeur ne se incrément - pour tous les arguments qui pourraient le suivre. Il peut être utilisé comme clé d'index. Après avoir fait ce quieval
précède, je peux faire:...obtenir...
Et donc:
PRODUCTION
Et aux arguments qui ne correspondent pas, je remplacerais ignoré dans le
for ... in
champ ci-dessus pour obtenir:la source