Bash IF语句:命令输出的字符串比较始终为false

Bash IF语句:命令输出的字符串比较始终为false,bash,if-statement,gnu-screen,Bash,If Statement,Gnu Screen,大家好,我正在尝试编写一个简单的bash脚本来附加到屏幕会话。如果会话尚未启动,则它将启动会话并再次尝试连接 我遇到的问题是if语句;它应该将screen命令的输出与失败消息进行比较,如果它们相等,则继续启动会话并连接。但它总是转到else子句,打印出我检查的错误消息:s 两个字符串包含相同的内容: “没有要连接的屏幕与sctest匹配。” 但是bash认为他们是不同的 这是bash脚本,我遗漏了什么 #!/bin/bash screenOutput=$(screen -aA -x sctes

大家好,我正在尝试编写一个简单的bash脚本来附加到屏幕会话。如果会话尚未启动,则它将启动会话并再次尝试连接

我遇到的问题是if语句;它应该将screen命令的输出与失败消息进行比较,如果它们相等,则继续启动会话并连接。但它总是转到else子句,打印出我检查的错误消息:s

两个字符串包含相同的内容:

“没有要连接的屏幕与sctest匹配。”

但是bash认为他们是不同的

这是bash脚本,我遗漏了什么

#!/bin/bash

screenOutput=$(screen -aA -x sctest);
failString="There is no screen to be attached matching sctest.";

if [ "$screenOutput" = "$failString" ]; then
    echo "screen session not started. starting now...";

    # . ./init.sh

    # echo $(screen -aA -x sctest);
else
    echo "$screenOutput";
fi
使用
set-x
(或调用
bash-x yourscript
)打印每一行,并使用扩展的值对其进行计算,以使隐藏字符可见和可读

最有可能的情况是,您将看到以下内容:

[ 'There is no screen to be attached matching sctest' = $'There is no screen to be attached matching sctest\r' ]
…后者的末端有一个
\r
。这是回程车

要删除它,您可以修改代码,如下所示:

screenOutput=$(screen -aA -x sctest)
screenOutput=${screenOutput%$'\r'}

我几乎一发帖就发现了这个问题。我通过删除显示$screenOutput结尾处有一个\r的空格而犯了if行错误。-如果有人有一个命令来查看这些不可见字符的答案,那么这将是一个非常受欢迎的接受答案:)它失败了,因为存储在
screenOutput
中的输出被
^M
终止。您可以运行
cat-vET,屏幕上正好有一个选项:
-R
创建会话(如果尚未存在)。由@CharlesDuffy发布的答案是正确的。但出于好奇,您可以这样设置
failString
的值
printf-v failString“%s%b”没有与sctest匹配的屏幕。“\\\x0d
。或者
$”
文本:
failString=$”没有与sctest匹配的屏幕。\r'
谢谢!我可以搜索什么来获取更多关于
${screenOutput%$'\r'}
正在做什么的信息,google似乎不再关心特殊字符了:/