[[ … ]]
оценивает условное выражение . В условном выражении -z
— это оператор, который принимает строку в качестве аргумента и возвращает true, если строка пуста, и false в противном случае.
В for ((…; …; …))
каждая из трех частей, разделенных точкой с запятой -внутри двойных скобок, является арифметическим выражением . В арифметическом выражении -
является оператором отрицания или вычитания. z
— ссылка на переменную z
,оценка до 0, если переменная не определена. Поэтому, когда вывод lsof -i4TCP:8083 -sTCP:LISTEN -t
пуст, а z
не определен, выражение оценивается как 0, поэтому цикл завершается. Если выходные данные не пусты, это может привести к синтаксической ошибке в арифметическом выражении. То, что вы написали, просто не имеет смысла в арифметическом выражении.
Эта форма for
предназначена для итераций, определяемых арифметическим путем, обычно от некоторого начального значения до некоторого конечного значения. Кажется, вам нужен цикл while, поэтому напишите цикл while и используйте условное выражение.
while [[ -z $(lsof -i4TCP:8083 -sTCP:LISTEN -t) ]]; do
echo "waiting for startup"
sleep 1
done
См. также круглые и фигурные скобки в bash .