【问题标题】:Why is my bash string comparison of two identical strings always false?为什么我对两个相同字符串的 bash 字符串比较总是错误的?
【发布时间】:2011-08-29 03:19:25
【问题描述】:

我正在尝试编写一个简单的小脚本来查询 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.$

【问题讨论】:

  • 最后没有多余的换行符吧?
  • 试试./test_3g.sh | cat -A。如果您的cat 不支持-A 选项,请尝试./test_3g.sh | cat -v
  • 我不认为有任何多余的空格,但很乐意对此进行更正。 @Keith,我已将管道的输出添加到 cat -A 到问题中。

标签: bash shell logical-operators


【解决方案1】:

您必须在运算符周围放置空格:

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

没有空格你会得到一个字符串,相当于"$a!=$b"。如果该字符串不为空,则仅测试一个字符串会返回 true...

【讨论】:

  • 你比我早了 15 秒!
  • 没有空格,表达式是单个字符串"Not connected.!=Not connected."。作为 bash 表达式,如果字符串的长度不为零,则将其视为真; [[ STRING ]] 等价于 [[ -n STRING]]。 (info bash,搜索\[\[,然后按照注释“Bash 条件表达式”。)
  • 在我的 15 分钟 +1 中击败我以获得“$a!=$b”的解释
  • Bash 有一些有趣的解析机制:D
【解决方案2】:

使用case/esac。如果您不必纠结if/else 的细微差别

case "$a" in
"$b" ) echo "ok";;
*) echo "not ok";;
esac

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 不,这没有做到,对不起!无论您是否添加,我都会将结果存储在b 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    相关资源
    最近更新 更多