Bash - If 语句执行空比较

Bash - If statement performing empty comparision

我知道这听起来很傻,但这周开局很糟糕,我无法清晰地思考。

我正在编写这段简单的代码,预计稍后会变得不那么复杂。但是我被困在这个简单的 If 条件语句附近。

我在主机 Ubuntu 上用 VS 编写代码,将其复制到 docker 容器内的文件并执行。

如你所见,IF条件的左边被当做空值进行比较。我哪里错了?

#!/bin/bash

someEquation()
{
    cluster_state=`src/redis-cli -h 127.0.0.1 -p 36000 cluster info | grep cluster_state | awk -F':' '{print}'`
    if [[ " ${cluster_state} " == "fail" ]]; then
        echo "arr contains fail"
    fi
}

someEquation

输出:

+ someEquation
++ src/redis-cli -h 127.0.0.1 -p 36000 cluster info
++ grep cluster_state
++ awk -F: '{print}'
+ cluster_state=$'fail\r'
  == \f\a\i\l ]]

通过查看 OP 的尝试 editing/improving 此处的 OP 代码。

  • 我在此处附加了删除控制 m 个字符的逻辑以及您的逻辑。
  • 此外,当我们使用 awk 时,我们不需要将 grep 与它一起使用,所以我也将其删除,作为改进。但是公平警告还没有测试它应该工作但是。
  • 根据 Barmar 先生的评论,从变量中删除了空格,否则会给出错误的结果。
  • 为了将命令的值保存到变量,也将反引号更改为 $(....)
someEquation()
{
    cluster_state=$(src/redis-cli -h 127.0.0.1 -p 36000 cluster info | awk -F':' '/cluster_state/{gsub(/\r/,"",);print }')
    if [[ "${cluster_state}" == "fail" ]]; then
        echo "arr contains fail"
    fi
}

someEquation

如果变量 cluster_state 总是 有尾部回车 return(十六进制:0d),比较前从变量中删除最后一个字符:

[[ "${cluster_state%?}" == "fail" ]]

或者在另一边加一个马车return:

[[ "${cluster_state}" == "fail"$'\r' ]]