"while" 루프는 변수의 내용을 읽지 않습니다.

"while" 루프는 변수의 내용을 읽지 않습니다.

내 문제를 설명하기 위해 작은 스크립트를 설정했습니다.

while동일한 동안 계속 반복되는 루프를 설정했습니다.$outputNo screen session found

#!/bin/bash

echo Stopping server...

output=$(screen -S tls -X eval 'stuff "stop\015"')

while [ "$output" = "No screen session found." ]
do 
        echo "$output"
        sleep 1
done

echo Server stopped!

이 스크립트를 실행하면 즉시 중지됩니다.

Stopping server...
Server stopped!

좋아요, 그래서 제 생각 $outputNo screen session found..

그러나 루프를 다음과 같은 루프 while로 전환하면 :until

until [ "$output" = "No screen session found." ]

$output내 루프가 방금 본 문자열과 같지 않기 때문에 이제 루프가 반복되기 시작할 것이라고 예상해야 합니다 . 루프가 계속 반복되는 동안 echo $output내가 추가한 명령은 루프가 실제로 종료되어야 함을 나타냅니다!

Stopping server...
No screen session found.
No screen session found.
No screen session found.
No screen session found.

~처럼$output 동일한 No screen session found.!

무슨 일이야?whileand until루프가 내용을 무시하는 이유는 무엇입니까 $output?

답변1

-x추적을 활성화하기 위해 스크립트를 실행하는 경우

bash -x myscript.sh

당신은 볼 수 있습니다 :

+ echo Stopping server...
Stopping server...
++ screen -S tls -X eval 'stuff "stop\015"'
' output='No screen session found.
' = 'No screen session found.' ']'
+ echo Server 'stopped!'
Server stopped!

보시다시피 @muru의 의견은 정확합니다. 끝에 캐리지 리턴이 있으므로 $output문자열을 일치시킬 수 없습니다.

Bash를 사용하고 있으므로 간단한 해결책은 일치 표현식에 와일드카드를 사용하는 것입니다.

#!/bin/bash

echo Stopping server...

output=$(screen -S tls -X eval 'stuff "stop\015"')

while [[ "$output" = "No screen session found."* ]]
do 
        echo "$output"
        sleep 1
done

echo Server stopped!

이 명령을 실행하면 다음이 생성됩니다.

Stopping server...
No screen session found.
No screen session found.
.
.
.

@DonHolgo가 지적했듯이 이 시점에서 무한 루프가 발생하므로 이 문제도 해결해야 합니다.


screen더 나은 해결책은 출력을 일치시키려고 시도하는 대신 종료 코드를 살펴보는 것입니다 . 다음과 같이 작성할 수 있습니다.

#!/bin/bash

echo Stopping server...

while ! screen -S tls -X eval 'stuff "date\015"'; do
  sleep 1
done

echo Server stopped!

screen실행되지 않는 동안 시작한 다음 다른 터미널에서 세션을 시작하면 다음이 표시됩니다 .

Stopping server...
No screen session found.
No screen session found.
Server stopped!

관련 정보