이 명령은 포트 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
아무 것도 출력하지 않지만 이 조건은 평가 시 true if
이므로 true인 경우 이 루프는 do...done
블록을 실행하고 "처리됨"을 인쇄해야 하지만 그렇지 않고 즉시 종료됩니다. 왜 이런 일이 발생합니까?
답변1
[[ … ]]
평가하다조건식. 조건식에서 -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의 괄호, 대괄호 및 중괄호.
답변2
for
대신 루프를 사용하는 이유는 무엇입니까 while
?
while [[ -z $(lsof -i4TCP:8083 -sTCP:LISTEN -t) ]]
do
echo "waiting for startup"
sleep 1
done