私は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
以外の方法でスクリプトの残りをスキップする方法はありますか?ただし、起動シェルを終了することはありませんか?
exit
をreturn
で置き換えることは、関数呼び出しのように機能せず、残りのスクリプトが実行されます。
ありがとう。
return
を使用します。
Return bashビルトインは、呼び出し元の(親/ソース)スクリプトを停止せずに、ソーススクリプトを終了します。
Man bashから:
戻る[n]
関数に実行を停止させ、nで指定された値を呼び出し元に返します。 nを省略すると、戻りステータスは関数本体で実行された最後のコマンドのステータスになります。 …returnが関数の外部で使用されているが、。(source)コマンドによるスクリプトの実行中に、シェルがそのスクリプトの実行を停止し、nまたは最後に実行されたコマンドの終了ステータスを返すようにするスクリプトの終了ステータスとしてのスクリプト。…
スクリプトを関数にラップし、return
を使用して記述できます。
#!/bin/bash
main () {
# Start of script
if [ <condition> ]; then
return
fi
# Rest of the script will not run if returned
}
main "$@"
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