オプションが認識されない場合、または予想されるオプション引数が見つからない場合は、スクリプト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
残りのスクリプトをスキップして呼び出しシェルを終了しない以外に、他の方法はありますか?
置換は関数呼び出しのようには機能exit
せreturn
ず、残りのスクリプトが実行されます。
ありがとうございます。
答え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
あなたの場合:
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