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.