コマンドを実行して、より少ない文字数で終了コードを取得するにはどうすればよいですか?


13

以前は次のようにスクリプトを記述していました。

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

それは私がsome_command二度書かなければならないことをいつも私をいらいらさせました。ループテストセクション内にそれを配置できますか?

回答:


20

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

while ! some_command; do sleep 1; done

some_commandエラーで終了する限り、条件は真のままです。

または、追加のチェックを行う場合のより詳細な方法:

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

ワンライナーですが、これは私のものよりも良く見えます;
Anthon 14

OPは、失敗したときにいくつかのコマンドを実行する必要がある場合、複数の行に分割することもできますが、:)
ジョンWHスミス14

セミコロンで改行して複数行にできない理由はありません。
マークスチュワート14

1
...または書くwhile ! some_command; do several; commands; sleep 1; done
イグニス14

12

これがuntilループの目的です。

until some_command
do    sleep 1
done

whileループの論理否定です。

スペックは言います:

untilループ

  • untilループは、連続的に1実行しなければならない化合物リストを長く別限り化合物リストは、ゼロ以外の終了ステータスを有しています。

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

    compound-list-1まで
    compound-list-2を実行します
    やった
  • 化合物リスト-1が実行され、されなければならない、それはゼロの終了ステータス、持っている場合はuntilコマンドが完了します。そうでない場合は、compound-list-2が実行され、プロセスが繰り返されます。

4

あなたはただすることができます:

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

ただし、これには常に1秒先にスリープするという欠点があります

0で終了するいくつかのコマンドのいずれかで終了できるようにする場合は、次のようにします。

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

もちろんこれはちょうど some_command


5
第二の例が含まれてはならない[]コマンドの周り。
nyuszika7h

2

POSIX.1-2001以前のシェル環境を凍結したシステムでは動作しませwhile ! ...until ...。ただし、これは行います。

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

完全な移植性が必要ない場合、なぜシェルスクリプトを作成するのですか?Perlはある以上バッシュよりも利用可能である可能性が高いです。

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

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

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