在获取脚本时,如何在不退出调用 shell 的情况下跳过脚本的其余部分?

在获取脚本时,如何在不退出调用 shell 的情况下跳过脚本的其余部分?

我有一个 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之外,还有其他方法吗?

替换exitreturn不像函数调用那样工作,脚本的其余部分将运行。

谢谢。

答案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

return退出源脚本(和函数)

在你的情况下:

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

相关内容