2017-08-25 6 views
0

Je suis en train d'utiliser getopts comme ceci:Comment utiliser getopts dans un script bash?

#!/bin/bash 

while getopts "i" option 
do 
case "${option}" 
in 
i) INT=${OPTARG};; 
esac 
done 
echo "$INT" 

Mais il imprime $ INT que si j'utilise getopts "i:". Si je comprends bien, les deux-points dans l'optstring signifient que les valeurs sont requises pour les drapeaux correspondants. Mais je veux rendre ce drapeau optionnel. Quelqu'un peut-il expliquer pourquoi le script agit comme ceci et comment puis-je le réparer?

+1

La présence du signe deux-points signifie qu'un argument d'option est requis. L'absence de deux points signifie qu'aucun argument d'option n'est attendu du tout. Le manuel de Bash sur ['getopts'] (http://www.gnu.org/software/bash/manual/bash.html#index-getopts) ne supporte pas les arguments optionnels. Pour cela, vous auriez besoin de GNU 'getopt' (avec beaucoup de sémantique différente). –

+0

@JonathanLeffler ah, merci beaucoup. Je pense que j'ai besoin de supprimer ma question car elle ne peut pas être répondue. – kusayu

+0

Voir la question connexe [Utilisation de 'getopts' dans le script shell Bash pour obtenir des options de ligne de commande longues et courtes] (https://stackoverflow.com/questions/402377/using-getopts-in-bash-shell-script-to-get -long-and-short-command-line-options). Ce n'est pas une copie directe, mais contient des informations utiles. –

Répondre

1

Vous ne pouvez pas le rendre (bash getopts) optionnel comme ça. Le "getopts" ne prend pas en charge les options obligatoires ou facultatives. Vous auriez besoin de coder pour cela. Et si un ":" est spécifié alors il doit y avoir un argument à cette option. Il n'y a aucun moyen de contourner cela.

Les extraits de code suivants montrent comment vérifier les arguments obligatoires.

# Mandatory options 
arg1=false; 
.. 
... 
case "${option}" 
in 
i) INT=${OPTARG}; arg1=true; 
;; 
esac 
if ! $arg1; 
then 
    echo -e "Mandatory arguments missing"; 
    # assuming usage is defined 
    echo -e ${usage}; 
    exit 1; 
fi