2013-10-05 3 views
0

Chaque fois que je l'utilise getopts et je ne donne aucun argument pour un drapeau donné, je reçois le message suivant: "option requires an argument -- d"Changer aucun cas par défaut args dans getopts - bash

je voudrais supprimer ce message et permettre à l'utilisateur pour retaper les options à l'aide de la commande read.

Voici mon cas dans les getopts:

if [ $# -lt $OPTIND ]; then 
    echo "Option -d argument missing: needs 2 args" 
    echo "Please enter two args: <arg1> <arg2>" 
    read d_ID d_SIZE 
    echo "disc $d_ID $d_SIZE" >> $FILENAME 
else 
    d_ID=$OPTARG 
    eval d_SIZE=\$$OPTIND 
    echo "disc $d_ID $d_SIZE" >> $FILENAME 
fi 
;; 

Répondre

2

Je pense que le comportement que vous voulez est une mauvaise idée; Il existe des programmes qui prennent des options avec des arguments optionnels, et ils ne fonctionnent pas comme ce que vous décrivez. Votre approche va probablement dérouter vos utilisateurs; il sera difficile pour d'autres programmes d'interagir avec lui; et cela limitera l'extensibilité future de votre script. (Imaginez que vous voulez ajouter une autre option plus tard. your_script.sh -d -e passera -e comme argument à -d, même si l'utilisateur voulait utiliser -d sans argument et destiné -e comme option séparée.) Et il est particulièrement bizarre d'attendre un argument si c'est sur la ligne de commande, mais deux arguments de l'entrée standard.

Cela étant dit. . .

Pour obtenir l'effet d'un argument optionnel, vous pouvez dire getopts d'être "silencieux" (c'est-à-dire d'utiliser "silent error report") en plaçant un deux-points : au début de la chaîne d'option . (Par exemple, au lieu de getopts d: ..., vous écrivez getopts :d: ....) Ensuite, quand l'argument d'une option est manquant, il va définir l'option-name à : (au lieu de d) et OPTARG à l'option-name (à savoir d, au lieu de l'option-argument).

Par exemple, le script ci-dessous peut être appelé soit comme script.sh -d foo ou script.sh -d, ce dernier faisant l'utilisateur d'être invité à saisir une valeur:

#!/bin/bash 

if getopts :d: arg ; then 
    if [[ "$arg" == d ]] ; then 
     d="$OPTARG" 
    else 
     read -p 'Enter d: ' d 
    fi 
    echo "d is: $d" 
else 
    echo 'no d' 
fi 

Entraînant:

$ ./script.sh 
no d 

$ ./script.sh -d 
Enter d: x 
d is: x 

$ ./script.sh -d y 
d is: y 
Questions connexes