问题:
如果我的程序选择' -v'它应该打印"再见!"在计划结束时。我可以这样做,但它会在开头打印出来。所以我需要一些最终会执行它的命令,如果有的话。或者我该怎么做?
getopts "v" opt
case ${opt} in
v) echo "Good bye!"
esac
答案 0 :(得分: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 ...
答案 1 :(得分:0)
假设您的-v
旨在"详细",我喜欢在许多脚本中set -x
来获取调试输出。如果你这样做,你可以用这样的无操作语句来编写你的脚本,这些语句在没有详细的情况下作为读者的注释,但在详细的时候输出到stderr -
: 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
关闭,那将无害地执行并且不输出任何内容。