式はforループではfalseと評価され、ifではtrueと評価されます。

式はforループではfalseと評価され、ifではtrueと評価されます。

このコマンドは、ポート 8083 でリッスンしているプロセスの PID を印刷します。

lsof -i4TCP:8083 -sTCP:LISTEN -t

プロセスがなければ、空の文字列が返されます。そのポートで実行中のプロセスがないため、コマンドが空の文字列を返すことを確認しています。

if [[ -z $(lsof -i4TCP:8083 -sTCP:LISTEN -t) ]]; then
    echo "waiting for startup"
else
    echo "process is listening on port 8083"
fi

期待どおり「Waiting to start」が出力されますが、これを行うと次のようになります。

for (( ; -z $(lsof -i4TCP:8083 -sTCP:LISTEN -t) ; )); do
    echo "waiting for startup"
    sleep 1
done

何も出力しませんが、この条件は評価時に trueifなので true の場合、このループはdo...doneブロックを実行して「処理済み」を印刷する必要がありますが、そうではなくただちに終了します。なぜこれが起こるのですか?

ベストアンサー1

[[ … ]]評価する条件式。条件式では、-z文字列をパラメータとして受け入れ、文字列が空の場合はtrueを返し、そうでない場合はfalseを返す演算子です。

for ((…; …; …))二重括弧内のセミコロンで区切られた3つの部分は、それぞれ算術表現。算術式の-否定演算または減算演算子です。z変数への参照z、または変数が定義されていない場合は0。したがって、の出力が空で定義さlsof -i4TCP:8083 -sTCP:LISTEN -tれていzない場合、式はゼロと評価され、ループが終了します。出力が空でないと、算術式で構文エラーが発生する可能性があります。あなたが書いた内容は算術表現では意味がありません。

この形式はfor算術的に決定された反復のために設計されており、通常は初期値から最終値まで計算されます。 whileループが欲しいので、whileループを作成して条件式を使用してください。

while [[ -z $(lsof -i4TCP:8083 -sTCP:LISTEN -t) ]]; do
    echo "waiting for startup"
    sleep 1
done

また、見ることができますBashの括弧、角括弧、中括弧

おすすめ記事