ローカルマシンに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!"
私はここで何が間違っているのですか?
シンプルに保つ
until nc -z 127.0.0.1 25565
do
echo ...
sleep 1
done
シェルに暗黙的に終了ステータスを処理させるだけです
シェルは、($?
に記録された)終了ステータスを、明示的と暗黙の2つの方法で処理できます。
明示的:status=$?
、これによりさらに処理が可能になります。
暗黙:
すべてのステートメントについて、頭の中で、単語「succeeds」をコマンドに追加してから、フレーズが意味をなすまで、それらの周りにif
、until
、またはwhile
構文を追加します。
until nc
成功; do ...; done
-z
オプションは、nc
によるstdinの読み取りを停止するため、< /dev/null
リダイレクトは必要ありません。
あなたは次のようなことを試すことができます
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!"