このコマンドは、ポート 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の括弧、角括弧、中括弧。