私は次のスクリプトを書いた。
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
にコマンドが失敗した場合にのみ実行されます。)