我有一个 bash 脚本,当无法识别选项或找不到预期的选项参数时,我会在其中调用exit
某处以跳过脚本的其余部分。getopts
while getopts ":t:" opt; do
case $opt in
t)
timelen="$OPTARG"
;;
\?) printf "illegal option: -%s\n" "$OPTARG" >&2
echo "$usage" >&2
exit 1
;;
:) printf "missing argument for -%s\n" "$OPTARG" >&2
echo "$usage" >&2
exit 1
;;
esac
done
# reset of the script
我source
将脚本放在 bash shell 中。当出现问题时,shell 会退出。
exit
除了跳过脚本的其余部分但不退出调用 shell之外,还有其他方法吗?
替换exit
为return
不像函数调用那样工作,脚本的其余部分将运行。
谢谢。
答案1
使用return
。
return bash 内置命令将退出源脚本而不停止调用(父/源)脚本。
来自 man bash:
return [n]
使函数停止执行并将 n 指定的值返回给其调用者。如果省略 n,则返回状态为函数体中最后执行的命令的状态。 ……如果 return 在函数外部使用,但在 . (source) 命令,它会导致 shell 停止执行该脚本,并返回 n 或脚本内执行的最后一个命令的退出状态作为脚本的退出状态。……
答案2
您可以简单地将脚本包装在函数中,然后使用return
您描述的方式。
#!/bin/bash
main () {
# Start of script
if [ <condition> ]; then
return
fi
# Rest of the script will not run if returned
}
main "$@"
答案3
在你的情况下:
while getopts ":t:" opt; do
case $opt in
t)
timelen="$OPTARG"
;;
\?) printf "illegal option: -%s\n" "$OPTARG" >&2
echo "$usage" >&2
return 1
;;
:) printf "missing argument for -%s\n" "$OPTARG" >&2
echo "$usage" >&2
return 1
;;
esac
done
测试示例:
$ cat script1.sh
echo script1
source ./script2.sh
echo script1 ends
$ cat script2.sh
echo script2
while true; do
return
done
echo script2 ends
$ bash script1.sh
script1
script2
script1 ends
直接采购也script2.sh
可以做正确的事情(无需退出当前的 shell 会话):
$ source script2.sh
script2
答案4
在某些情况下,我希望允许退出,除非我位于第一个 shell,所以我使用这个:
if [[ $SHLVL -gt 1 ]]; then exit 0; fi