내 문제를 설명하기 위해 작은 스크립트를 설정했습니다.
while
동일한 동안 계속 반복되는 루프를 설정했습니다.$output
No 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!
좋아요, 그래서 제 생각 $output
엔 No 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.
!
무슨 일이야?while
and 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!