set -o errexit
エラーが発生するとスクリプト全体が失敗した時点で終了するように使用するbashスクリプトがあります。
スクリプトはcurl
、意図したファイルの取得に失敗することがあるコマンドを実行します-ただし、これが発生しても、スクリプトは終了をエラーにしません。
にfor
ループを追加しました
- 数秒間停止してから
curl
コマンドを再試行します false
forループの下部で使用して、デフォルトの非ゼロの終了ステータスを定義します-curlコマンドが成功した場合-ループが中断し、最後のコマンドの終了ステータスはゼロになります。
#! /bin/bash
set -o errexit
# ...
for (( i=1; i<5; i++ ))
do
echo "attempt number: "$i
curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
if [ -f ~/.vim/autoload/pathogen.vim ]
then
echo "file has been retrieved by curl, so breaking now..."
break;
fi
echo "curl'ed file doesn't yet exist, so now will wait 5 seconds and retry"
sleep 5
# exit with non-zero status so main script will errexit
false
done
# rest of script .....
問題は、curl
コマンドが失敗したときに、ループがコマンドを5回再試行することです。すべての試行が失敗した場合、forループが終了し、メインスクリプトが再開しerrexit
ます。
このcurl
ステートメントが失敗した場合、スクリプト全体を終了するにはどうすればよいですか?
true
breakステートメントの前に明示的に配置して、ループの終了値を確保するのは良い考えだと思いますか?