표현식은 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

아무 것도 출력하지 않지만 이 조건은 평가 시 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

관련 정보