2017-10-16 6 views
-2

Problème:
Si mon programme prend l'option '-v' il devrait imprimer "Au revoir!" à la fin du programme. Je peux le faire, mais il l'imprimera au début. J'ai donc besoin d'une commande qui l'exécutera à la fin, le cas échéant. Ou comment puis-je faire cela?Bash. Commande getopts option qui fera quelque chose à la fin du programme

getopts "v" opt 
case ${opt} in 
v) echo "Good bye!" 
esac 
+0

Qu'est-ce qu'un "smth"? – maffo

+0

@poixen: Probablement une abréviation pour "quelque chose". Je vais éditer. –

Répondre

1

Vous venez de définir une variable lors de l'analyse des options, et à la fin du script, en fonction de la valeur de la variable que vous allez effectuer votre action désirée

say_bye=false 
while getopts "v" opt; do 
    case "$opt" in 
    v) say_bye=true ;; 
    esac 
done 

# do stuff 

# and at the end: 
$say_bye && echo "Good bye!" 

Si votre script a plusieurs points de fin potentiels, et que vous voulez dire au revoir pour chacun d'eux, utilisez un piège EXIT

say_bye=false 
while getopts "v" opt; do 
    case "$opt" in 
    v) say_bye=true ;; 
    esac 
done 

end_business() { 
    $say_bye && echo byebye 
} 
trap end_business EXIT 

# do the rest of your script here ... 
+0

Cela semble ** vraiment dangereux **! Exécuter aléatoirement le contenu d'une variable, juste pour tester si la variable est définie. – randomir

+1

@randomir: Il n'y a rien de trop aléatoire, vous contrôlez vous-même la valeur de la variable. Si ses seules valeurs possibles sont false et true, l'exécuter est sûr. –

+0

Il est tout à fait fragile et non intuitif pour quelqu'un qui lit le code plus tard. Pourquoi pas say_bye = 0'/'say_bye = 1' et ensuite' ((say_bye)) && action'? – randomir

0

en supposant que votre -v est destiné comme « bavard », j'aime set -x dans de nombreux scripts pour obtenir une sortie de débogage. Si vous faites cela, vous pouvez agrémenteront votre script sans-op des déclarations comme celle-ci, qui agissent comme des commentaires pour le lecteur lorsqu'ils ne sont pas bavard, mais la sortie d'erreur lorsque verbeux est sur -

: setting x to "$x" 

Cela cadre bien avec une piège sur EXIT, comme déjà mentionné @glenn. Ainsi,

while getopts "v" opt 
do case "$opt" in 
    v) verbose=1 # in case you need other contingent code bits 
     set -v ;; 
    esac 
done 

Puis

trap ' : "bye-bye!" ' EXIT 

qui exécuteront sans dommage et rien de sortie si set -x est désactivé.