“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!

好吧,所以我想$output不等于No screen session found.

但是,如果我将循环切换whileuntil这样的循环:

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.

到底是怎么回事?为什么whileanduntil循环忽略 的内容$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!

相关内容