web-dev-qa-db-ja.com

バッシュ:コマンドの終了ステータスが0になるまでループする

ローカルマシンにnetcatをインストールし、ポート25565でサービスを実行しています。次のコマンドを使用します。

nc 127.0.0.1 25565 < /dev/null; echo $?

Netcatはポートが開いているかどうかをチェックし、開いている場合は0を返し、閉じている場合は1を返します。

コマンドからの出力が0になる(ポートが開く)まで、無限にループし、上記のコマンドを毎秒実行するbashスクリプトを作成しようとしています。

私の現在のスクリプトは、ポートが開いた後でも(1が0になる)、「...」を際限なくループし続けます。

until [ "nc 127.0.0.1 25565 < /dev/null; echo $?" = "0" ]; do
         echo "..."
         sleep 1
     done
echo "The command output changed!"

私はここで何が間違っているのですか?

12
Snaacky

シンプルに保つ

until nc -z 127.0.0.1 25565
do
    echo ...
    sleep 1
done

シェルに暗黙的に終了ステータスを処理させるだけです

シェルは、($?に記録された)終了ステータスを、明示的と暗黙の2つの方法で処理できます。

明示的:status=$?、これによりさらに処理が可能になります。

暗黙:

すべてのステートメントについて、頭の中で、単語「succeeds」をコマンドに追加してから、フレーズが意味をなすまで、それらの周りにifuntil、またはwhile構文を追加します。

until nc成功; do ...; done


-zオプションは、ncによるstdinの読み取りを停止するため、< /dev/nullリダイレクトは必要ありません。

46
Henk Langeveld

あなたは次のようなことを試すことができます

while true; do
    nc 127.0.0.1 25565 < /dev/null
    if [ $? -eq 0 ]; then
        break
    fi
    sleep 1
done
echo "The command output changed!"
8
Lee Duhem