web-dev-qa-db-ja.com

スクリプトを取得するときに、起動シェルを終了せずに残りのスクリプトをスキップするにはどうすればよいですか?

私は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

私はbashシェルのスクリプトをsourceします。何かが間違っていると、シェルは終了します。

exit以外の方法でスクリプトの残りをスキップする方法はありますか?ただし、起動シェルを終了することはありませんか?

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

ありがとう。

7
Tim

returnを使用します。

Return bashビルトインは、呼び出し元の(親/ソース)スクリプトを停止せずに、ソーススクリプトを終了します。

Man bashから:

戻る[n]
関数に実行を停止させ、nで指定された値を呼び出し元に返します。 nを省略すると、戻りステータスは関数本体で実行された最後のコマンドのステータスになります。 …returnが関数の外部で使用されているが、。(source)コマンドによるスクリプトの実行中に、シェルがそのスクリプトの実行を停止し、nまたは最後に実行されたコマンドの終了ステータスを返すようにするスクリプトの終了ステータスとしてのスクリプト。

5
Isaac

スクリプトを関数にラップし、returnを使用して記述できます。

#!/bin/bash
main () {
    # Start of script
    if [ <condition> ]; then
        return
    fi
    # Rest of the script will not run if returned
}

main "$@"
3
John Moon

return exits sourced scripts(and functions)

あなたの場合:

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
1
Kusalananda