我设置了一个小脚本来说明我的问题。
我已经设置了一个循环,只要等于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
anduntil
循环忽略 的内容$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!