9
votes

Comment créer un script Bash avec des paramètres facultatifs pour un drapeau

J'essaie de créer un script qui aura un drapeau avec des options facultatives. Avec getopts, il est possible de spécifier un argument obligatoire (à l'aide d'un côlon) après le drapeau, mais je veux le garder facultatif.

Ce sera quelque chose comme ceci: P>

./install.sh -a3


0 commentaires

5 Réponses :


-1
votes

Utilisez la fonctionnalité GetOPT. Sur la plupart des systèmes, man getopt donnera une documentation pour cela et même des exemples de l'utiliser dans un script. De la page man de mon système:

Le fragment de code suivant montre comment on pourrait traiter les arguments Pour une commande capable de prendre les options et et -b, et l'option -o, qui nécessite un argument. xxx

Ce code acceptera l'un des éléments suivants comme équivalent: xxx


4 commentaires

getopt est la bonne réponse, mais votre long exemple ne démontre pas comment implémenter une option dont l'argument est également facultatif.


Cela se brisera si vos arguments contiennent des espaces. Exemple de solution.


Se faire voter parce que le contenu d'une page d'homme standard n'est pas de votre goût. Bons moments à ce sujet.


Ou parce que cela ne répond pas op et contient des bugs.



-1
votes

En bash, il existe une variable implicite: xxx

par exemple: xxx


5 commentaires

La question demande comment définir une option dont l'argument est également facultatif.


Ouais, et je préfère lui expliquer comment attraper un argument que de lui donner une réponse complète. Parfois, c'est mieux pour quelqu'un de trouver le chemin de lui-même ... Btw Votre réponse mérite A -1 à cause de votre "tandis que" ...


@Binogure tandis que TRUE n'est pas incorrect en soi et en soi - il doit y avoir une condition de terminaison, mais cela peut être une pause .


J'ai initialement laissé de côté la fin de la rupture tout en essayant de simplifier l'exemple qui est livré avec getopt .


Je suppose que vous vouliez dire #! / Bin / bash ;)



8
votes

Le programme code> getopt code> Permet aux options d'avoir un seul argument facultatif en ajoutant un double-point au nom d'option.

# Based on a longer example in getopt-parse.bash, included with
# getopt
TEMP=$(getopt -o a:: -- "$@")
eval set -- "$TEMP"
while true ; do
   case "$1" in
     -a)
        case "$2" in 
          "") echo "Option a, no argument"; shift 2 ;;
          *) echo "Option a, argument $2"; shift 2;;
        esac ;;
     --) shift; break ;;
     *) echo "Internal error!"; exit 1 ;;
   esac
done


3 commentaires

Exécution: ./ installer.sh -a 3 donne "option A, aucun argument" mais l'argument est "3"


getopt ne semble pas permettre un espace entre une option et son argument facultatif.


De man getopt : "Si l'option dispose d'un argument facultatif, il doit être écrit directement après le caractère d'option si présent."



-1
votes

Ma solution:

#!/bin/bash
count=0
skip=0
flag="no flag"
list=($@) #put args in array
for arg in $@ ; do #iterate over array
    count=$(($count+1)) #update counter
    if [ $skip -eq 1 ]; then #check if we have to skip this args
        skip=0
        continue
    fi
    opt=${arg:0:2} #get only first 2 chars as option
    if [ $opt == "-a" ]; then #check if option equals "-a"
       if [ $opt == $arg ] ; then #check if this is only the option or has a flag
            if [ ${list[$count]:0:1} != "-" ]; then #check if next arg is an option
                skip=1 #skip next arg
                flag=${list[$count]} #use next arg as flag
            fi
       else
            flag=${arg:2} #use chars after "-a" as flag
       fi 
    fi
done

echo $flag


3 commentaires

en $ @ est superflu. En outre, POSIX SH n'a pas de matrices. == n'est pas portable.


@ l0b0 Pourquoi en $ @ superflu? Il pourrait être substitué par list mais est nécessaire. Je suis d'accord, le code n'est pas portable et j'ai changé l'en-tête vers #! / Bin / bash


Parce que pour arg itérera sur "$ @" par défaut.



2
votes

Ce qui suit est sans getopt et il prend un argument facultatif avec le drapeau -a -a drapeau: xxx

Autres options / drapeaux peut également être ajouté facilement.


2 commentaires

En effet, la case n'était pas requise. édité ça. merci @ l0b0


NIT: dans "$ @" n'est pas requis. pour mot; faire va boucler sur les arguments.