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
5 Réponses :
Utilisez la fonctionnalité GetOPT. Sur la plupart des systèmes, 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. p> Ce code acceptera l'un des éléments suivants comme équivalent: p> man getopt code> donnera une documentation pour cela et même des exemples de l'utiliser dans un script. De la page man de mon système:
getopt code> 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.
En bash, il existe une variable implicite: par exemple: p>
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 code> n'est pas incorrect en soi et en soi - il doit y avoir une condition de terminaison, mais cela peut être une pause code>.
J'ai initialement laissé de côté la fin de la rupture code> code> tout en essayant de simplifier l'exemple qui est livré avec getopt code>.
Je suppose que vous vouliez dire #! / Bin / bash code>;)
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
Exécution: ./ installer.sh -a 3 code> donne "option A, aucun argument" mais l'argument est "3"
getopt code> ne semble pas permettre un espace entre une option et son argument facultatif.
De man getopt code>: "Si l'option dispose d'un argument facultatif, il doit être écrit directement après le caractère d'option si présent."
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
en $ @ code> est superflu. En outre, POSIX SH code> n'a pas de matrices. == code> n'est pas portable.
@ l0b0 Pourquoi en $ @ code> superflu? Il pourrait être substitué par list code> 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 code>
Parce que pour arg code> itérera sur "$ @" code> par défaut.
Ce qui suit est sans Autres options / drapeaux peut également être ajouté facilement. p> p> getopt code> et il prend un argument facultatif avec le drapeau -a -a drapeau:
En effet, la case code> n'était pas requise. édité ça. merci @ l0b0
NIT: dans "$ @" code> n'est pas requis. pour mot; faire code> va boucler sur les arguments.