forループの結果に基づいてエラーが発生したときにこのスクリプトを終了させるにはどうすればよいですか?

forループの結果に基づいてエラーが発生したときにこのスクリプトを終了させるにはどうすればよいですか?

set -o errexitエラーが発生した場合は、スクリプト全体を終了するために使用するbashスクリプトがあります。
スクリプトは、curl時々予想されるファイルを検索できないコマンドを実行します。ただし、これが発生すると、スクリプトはエラーで終了しません。

forループを追加しました

  1. 数秒間一時停止してcurlコマンドを再試行してください。
  2. for ループの一番下にfalse0 以外のデフォルト終了状態を定義するために使用します。カールコマンドが成功すると、ループは中断され、最後のコマンドの終了ステータスはゼロでなければなりません。
#! /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

ベストアンサー1

変える:

done

そして:

done || exit 1

forこれにより、ループがゼロ以外の終了コードで終了すると、コードは終了します。

ところで、1inは必要ありません。ダウンロードが失敗すると、exit 1通常のexitコマンドは最後に実行されたコマンドの終了ステータス(コード= 1)で終了します。falseダウンロードが成功すると、ループの終了コードはechoコマンドの終了コードです。 echo通常、成功を示す code=0 で終了します。この場合、||何もトリガーされず、exitコマンドは実行されません。

set -o errexit最後に、この内容は驚きに満ちている可能性があることに注意してください。長所と短所の議論については、以下を参照してください。グレッグのよくある質問 #105

文書

からman bash

~のため((式1;式2;式3));するリスト; 完璧
まず、算術式expr1は、以下の算術評価で説明する規則に従って評価される。次に、算術式 expr2 はゼロと評価されるまで繰り返し評価されます。 expr2がゼロ以外の値に評価されるたびに、listが実行され、算術式expr3が評価されます。式が省略された場合は1と評価されます。 戻り値は、リストで実行された最後のコマンドの終了状態、式が無効な場合はfalseです。[強調追加]

おすすめ記事