bashスクリプト:エラーを返す場合はコマンドを繰り返します


23

エラーが返された場合、ncftp転送を繰り返すループを作成したいと思います。

ループ内で終了コード変数をどのように使用できるかは少しわかりません。このようなものは機能しますか?

until [$? == 0]; do
    ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file
done

回答:


40

serverfaultのどこかでこのエレガントなループの基礎を見つけました。コマンド自体を直接テストできるため、終了コードを保存する必要はありません。

until ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file; do
  echo Tansfer disrupted, retrying in 10 seconds...
  sleep 10
done

8

ほぼ。ループの前に事前設定できるように、おそらく戻り値を変数として保存する方が良いでしょう。それ以外の場合は、最後に実行したコマンドの影響を受けます。

またsleep、そこにスリングを入れて、リスポーンが早すぎるのを防ぐこともできます。

RET=1
until [ ${RET} -eq 0 ]; do
    ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file
    RET=$?
    sleep 10
done

終了コードをRET変数に渡すのを忘れていたと思いますが、私はそのアイデアを得ました。私の主な質問は、until節がいつ評価されるかです。Cでは、ループの最初の実行が完了するまで評価されません。この場合、ループが機能するはずです。ただし、スリープなどの中間コマンドを許可するため、あなたのものはさらに優れています。ありがとう!
ロイ

よく見分けられます。編集しました。句は、最初の実行の前に評価されます。そのため、以前は、先行するコマンドのリターンコードを使用していました。二重等式はBashによって強制されませんが、使用することをお勧めします。
ダンキャリー

==私はそれが、この場合に重要とは思いませんが...、数字でない文字列の平等のためである
カイルブラント

単一および二重の等号は同じです。しかし、あなたがそれについて言及したので、整数の等式を使用する方が良いでしょう。
ダンキャリー

1
プログラムまで、戻りコード番号をテストする必要はありません-プログラム自体の戻りコードをテストするだけです。寝る3; 完了しました。
クリス

3

少しハックですが、私の解決策は、失敗して終了した場合にそれ自体を実行するbash関数を作成することでした

function retry { the_command_you_want && echo "success" || (echo "fail" && retry) }; retry

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.