【问题标题】:Simple if..else for command output giving wrong results简单的 if..else 命令输出给出错误的结果
【发布时间】:2023-01-21 09:22:10
【问题描述】:

我已经尝试了很多 SO 答案,但不知何故无法正常工作。

如果 redis 集群不是ok,我正在编写一个 bash 脚本以返回一个非零退出代码。 该脚本稍后将在 docker compose 的 healthcheck 标签中使用。

这是脚本:

#!/bin/bash

result="$(redis-cli -c -p 30006 --raw cluster info | grep cluster_state: | cut -d ":" -f2)"

echo "$result"

if [ "$result" = "fail" ]; then
    echo "failed"
    exit 1
fi

脚本的输出是:

I have no name!@ae2197466e7b:/data$ ./redis_healthcheck.sh 
fail
I have no name!@ae2197466e7b:/data$ echo $?
0

当从容器内部运行命令时,我得到:

I have no name!@ae2197466e7b:/data$ redis-cli -c -p 30006 --raw cluster info | grep cluster_state: | cut -d ":" -f2
fail
I have no name!@ae2197466e7b:/data$ redis-cli -c -p 30006 --raw cluster info 
cluster_state:fail
cluster_slots_assigned:16384
cluster_slots_ok:10923
cluster_slots_pfail:0
cluster_slots_fail:5461
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:8
cluster_my_epoch:8
cluster_stats_messages_ping_sent:3660
cluster_stats_messages_pong_sent:3660
cluster_stats_messages_sent:7320
cluster_stats_messages_ping_received:3660
cluster_stats_messages_pong_received:3660
cluster_stats_messages_received:7320
total_cluster_links_buffer_limit_exceeded:0

如图所示,即使结果是 fail,脚本也不会进入 if 块。

【问题讨论】:

  • $result 可能包含"fail\r"——通过od -c 将redis 输出通过管道传输以进行验证。
  • 你做的工作比必要的多。 if redis-cli -c - p 30006 --raw cluster info | grep -q cluster_state:fail; then ...; fi
  • @glennjackman 你是对的!它确实是\r\n..我使用tr -d '\r\n'删除了它并且它有效..@chepner你摇滚!如果解决方案不简单,它可能不是最好的 - 感谢您提醒我!
  • 您是否尝试过捕获stderr 以及stdout

标签: bash


【解决方案1】:

没有

redis-cli -c -p 30006 --raw cluster info

如果失败返回非零退出代码?

在这种情况下

if $[ $( redis-cli -c -p 30006 --raw cluster info >log ) -ne 0 ]
then
    echo "failed"
    exit 1
fi

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多