スクリプトをインポートするときに呼び出しシェルを終了せずにスクリプトの残りの部分をスキップできますか?

スクリプトをインポートするときに呼び出しシェルを終了せずにスクリプトの残りの部分をスキップできますか?

オプションが認識されない場合、または予想されるオプション引数が見つからない場合は、スクリプトexitの残りの部分をスキップするために何かを呼び出すbashスクリプトがあります。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シェルに入れました。問題が発生すると、シェルは終了します。

exit残りのスクリプトをスキップして呼び出しシェルを終了しない以外に、他の方法はありますか?

置換は関数呼び出しのようには機能exitreturnず、残りのスクリプトが実行されます。

ありがとうございます。

答え1

使用return

return bash組み込み機能は、呼び出し(親/ソース)スクリプトを停止せずにソーススクリプトを終了します。

メンズバッシュから:

return [n]
は、関数が実行を停止し、nで指定された値を呼び出し元に返すようにします。 nが省略された場合、返される状態は、関数本文で最後に実行されたコマンドの状態です。 …returnが関数の外部で使用されますが、.(ソース)コマンド内で使用されると、シェルはスクリプトの実行を停止し、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正しいことを行います(現在のシェルセッションを終了せずに)。

$ source script2.sh
script2

答え4

場合によっては、最初のシェルにない限りシャットダウンを許可したいので、次のようにします。

if [[ $SHLVL -gt 1 ]]; then exit 0; fi

関連情報