为什么我的Bash字符串比较两个相同的字符串总是为假?

9

我试图编写一个简单的脚本来查询3g连接,如果连接断开,则启动重新连接。

我的问题在于检查命令的输出 - 两个看似相等的字符串不能被评估为相等。我相信这里一定有一个新手错误!

#!/bin/bash

echo "Checking connection"
a="Not connected."
b=$(./sakis3g status --console)

if [[ "$a"!="$b" ]]; then 
    echo "Strings not equal:"
    echo "$a"
    echo "$b"
else 
    echo "Strings equal!!"
fi

运行时的输出:
user@mypc:~$ ./test_3g.sh 
Checking connection
Strings not equal:
Not connected.
Not connected.

当运行./test_3g.sh | cat -A时:
user@mypc:~$ ./test_3g.sh | cat -A
Checking connection$
Strings not equal:$
Not connected.$
Not connected.$

末尾没有多余的换行符,对吧? - user541686
2
尝试使用 ./test_3g.sh | cat -A 命令。如果你的 cat 不支持 -A 选项,尝试使用 ./test_3g.sh | cat -v 命令。 - Keith Thompson
我认为没有任何多余的空格,但如果有错误,我很乐意接受更正。@Keith,我已经将管道输出添加到cat -A中了。 - John Lyon
3个回答

27

你必须在运算符的两侧放置空格:

if [[ "$a" != "$b" ]]; then ...

如果没有空格,则得到一个单字符串,等同于"$a!=$b"。而仅测试一个字符串会在该字符串非空时返回true...


1
你比我快了15秒钟! - Keith Thompson
3
去掉空格后,该表达式是一个单一的字符串"Not connected.!=Not connected."。在Bash表达式中,如果字符串长度不为零,则将其视为True;[[ STRING ]][[ -n STRING]]等效。(参见info bash,搜索\[\[,然后查看说明“Bash条件表达式”。) - Keith Thompson
赶我一步,我的15分钟加1分是为了"$a!=$b"的解释。 - shabby
1
Bash有一些,让我们说,有趣的解析机制:D - ThorSummoner

6
使用case/esac语句。如果您不必处理if/else的琐碎细节。
case "$a" in
"$b" ) echo "ok";;
*) echo "not ok";;
esac

0

可能sakis3g程序将消息打印到stderr而不是stdout。在这种情况下,您可以将您的消息与空字符串进行比较。尝试将stderr重定向到stdout:

b=$(./sakis3g status --console 2>&1)

不好意思,那样做没有起作用!无论你加不加,我都得到了一个存储在b中的结果。 - John Lyon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接