コマンドを実行し、より少ない文字で終了コードを取得するには?

コマンドを実行し、より少ない文字で終了コードを取得するには?

私は次のスクリプトを書いた。

some_command
while [ $? -ne 0 ] ; do
    sleep 1
    some_command
done

some_command二度使ってみるといつも迷惑が出ますね。どういうわけかこれをループテストセクションに入れることができますか?

答え1

some_commandこれをテスト条件として使用できます。

while ! some_command; do sleep 1; done

終了時にエラーが発生する限り、このsome_command条件はtrueのままです。

または、追加のチェックを実行するには、より詳細なアプローチを使用できます。

while ! some_command
do 
    # add more if desired
    sleep 1
done

答え2

ループの用途は次のとおりですuntil

until some_command
do    sleep 1
done

それは循環性の論理的な否定ですwhile

これ仕様は次のとおりです。

until

  • このジョブはuntil連続して実行する必要があります。化合物一覧もう一つ化合物一覧ゼロ以外の終了状態があります。

  • Until ループの形式は次のとおりです。

    化合物リスト-1まで
    化合物リスト2の実行
    完璧
  • これ化合物リスト-1実行する必要があり、終了ステータスが0の場合、untilコマンドは完了します。そうでなければ、化合物リスト-2実行され、プロセスが繰り返されます。

答え3

次のことができます。

false
while [ $? -ne 0 ] ; do
   sleep 1
   some_command
done

これには欠点がありますが、常に最初に1秒間眠ります。

複数のコマンドのいずれかを使用してゼロで終了するには、次のようにします。

while true; do
  if [ some_command ] ; then break ; fi
  if [ some_other_command ] ; then break ; fi
  sleep 1
done

これはもちろん、以下にも当てはまります。some_command

答え4

また、POSIX.1-2001より前にシェル環境を固定したシステムにはwhile ! ...適用されません。until ...しかし、そうです。

while :; do
    if some command; then
        break
    fi
    sleep 1
done

完全な移植性が必要ない場合は、シェルスクリプトを書くのはなぜですか?パールはもっとおそらくBashよりも便利です。

sleep 1 while 0 != system qw(some command);

(上記のようsleepにコマンドが失敗した場合にのみ実行されます。)

関連情報