2017-10-16 103 views
-2

问题:
如果我的程序选择'-v',它应该打印“再见!”在节目结束时。我可以做到这一点,但它会在开始时打印它。所以我需要一些命令来执行它,如果有的话。或者我该怎么做?Bash。 getopts命令。选项,将在程序结束时执行某些操作

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

什么是“smth”? – maffo

+0

@poixen:可能是“something”的缩写。我会编辑。 –

回答

1

你只设置一个变量,在分析选项,并在脚本的末尾,基于变量的值,你会如果执行所需的操作

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!" 

您脚本有多个潜在的终点,你想说再见所有的人,请使用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

这看起来**非常危险**!随机执行一个变量的内容,只是为了测试变量是否被设置。 – randomir

+1

@randomir:没有什么是随机的,它可以自己控制变量的值。如果它唯一可能的值是'false'和'true',则执行它是安全的。 –

+0

对于稍后阅读代码的人来说,这是非常脆弱和不直观的。为什么不'say_bye = 0' /'say_bye = 1'然后'((say_bye))&& action'? – randomir

0

假设你-v意为“冗长”,我喜欢set -x在许多脚本中获取调试输出。如果你这样做,你可以用无操作语句这样,充当读者时不详细评论辣椒脚本,但输出到标准错误时冗长是 -

: setting x to "$x" 

这很好地与吻合在EXIT上陷阱,正如@glenn已经提到的那样。因此,

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

然后

trap ' : "bye-bye!" ' EXIT 

这将无害执行和输出咱这set -x关闭。

相关问题