J'ai ce code -
#getoptDemo.sh
usage()
{
echo "usage: <command> options:<w|l|h>"
}
while getopts wlh: option
do
case $option in
(w)
name='1';;
(l)
name='2';;
(h)
name='3';;
(*)
usage
exit;;
esac
done
print 'hi'$name
Lorsque je lance bash getoptDemos.sh
(sans l'option), il s'imprime hi
au lieu d'appeler la fonction usage
. Il appelle usage lorsque des options autres que w, h et l sont données. Cela ne peut alors pas fonctionner si aucune option n'est spécifiée.
Je l' ai essayé d' utiliser ?
, \?
, :
à la place de , *
mais je ne peux pas obtenir ce que je voulais. Je veux dire tout docs
le getopt
dit qu'il faut utiliser ?
.
Qu'est-ce que je fais mal?
/bin/bash
Réponses:
Lorsque vous exécutez ce script sans aucune option, getopt retournera false, donc il n'entrera pas du tout dans la boucle. Il ne restera plus qu'à imprimer - est-ce ksh / zsh?
Si vous devez avoir une option, le mieux est de tester $ name après la boucle.
Mais assurez-vous qu'il
$name
était vide avant d'appelergetopts
(car il pourrait y avoir eu$name
dans l'environnement le shell reçu au démarrage) avec(avant la
getopts
boucle)la source
no argument
condition à l'aide de bash.getopts
n'a pas une telle disposition. Le pire, c'est que vous ne pouvez pas voter.getopts
traite les options tour à tour. Voilà son travail. Si l'utilisateur ne passe aucune option, la première invocation degetopts
quitte la boucle while.Si aucune des options ne prend d'argument, la valeur de
OPTIND
indique le nombre d'options transmises. En général,OPTIND
c'est le nombre d'arguments qui sont des options ou des arguments pour les options, par opposition aux arguments sans option (opérandes).Dans tous les cas, vous n'essayez pas de déterminer s'il n'y avait pas d'options, mais si aucune des
name
options de paramétrage n'a été transmise. Vérifiezname
donc s'il n'est pas réglé (et prenez soin de le désactiver en premier) .la source
bash sample.sh -abc file.txt
cela donne -1 non-option arguments
. comment savoir combien d'options ont été proposées. (ici 3)Si votre script doit recevoir des arguments d'option dans tous les cas, placez ce bloc au début (avant les getops).
Block vérifie que la chaîne de paramètres ne commence pas par un
-
symbole, ce qui indique que le premier paramètre n'est pas un argument d'option.la source
Je le vérifierais avec une variable. Si getopts ne passe jamais la boucle en cas d'absence d'argument, vous pouvez l'utiliser par exemple comme ceci:
la source
Juste avant votre
getopts
bloc, vérifiez si$1
(le premier argument / option que vous avez passé sur la ligne de commande) est égal à une chaîne vide. Si c'est le cas, imprimez le message d'utilisation et quittez (ou exécutez une fonction "pas d'options" si vous êtes un anarchiste), sinon laissezgetopts
analyser les options comme d'habitude.La raison pour laquelle cette fonctionnalité n'est pas incluse dans getopts, c'est que vous pouvez déjà l'accomplir dans bash avec un "if-else". Exemple:
Ça a du sens?
la source