You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本if条件判断失效求助:433MHz灯光控制程序异常

问题分析与解决建议

嘿,我一眼就发现问题所在啦!你的Bash脚本里的if判断犯了一个非常常见的小错误——比较运算符=的两边没有加空格,这直接导致了条件判断完全不符合预期。

为什么会出错?

在Bash的test命令(也就是[ ... ]语法)中,=是一个比较运算符,它的左右两边必须用空格和操作数分隔开。如果写成"$1"="A",Shell会把整个"$1"="A"当成一个单一的字符串来判断:只要这个字符串不是空的,条件就会返回“真”。

看你给出的执行输出就能验证这一点:

+ [ B=A ]
+ [ Lol=off ]

这里Shell把B=A当成了一个完整的字符串(因为没有空格),而这个字符串显然非空,所以第一个if条件直接成立;第二个if里的Lol=off同理,也被判定为真,所以执行了关闭灯光的命令。

修正后的代码

只需要给每个=两边加上空格就可以解决问题:

#!/bin/sh -x
if [ "$1" = "A" ]; then
    if [ "$2" = "off" ] || [ "$2" = "0" ] || [ "$2" = "OFF" ] ;then
        /opt/433Utils/RPi_utils/codesend 1364
    else
        /opt/433Utils/RPi_utils/codesend 1361
    fi
fi

额外优化建议

如果你的Shell支持[[ ... ]](比如Bash,而不是POSIX标准的sh),可以用更简洁不易出错的语法,而且支持模式匹配,比如可以把第二个if的多条件合并:

#!/bin/bash -x
if [[ "$1" = "A" ]]; then
    if [[ "$2" =~ ^(off|0|OFF)$ ]]; then
        /opt/433Utils/RPi_utils/codesend 1364
    else
        /opt/433Utils/RPi_utils/codesend 1361
    fi
fi

或者用case语句来处理多值判断,可读性会更好:

#!/bin/sh -x
if [ "$1" = "A" ]; then
    case "$2" in
        off|0|OFF)
            /opt/433Utils/RPi_utils/codesend 1364
            ;;
        *)
            /opt/433Utils/RPi_utils/codesend 1361
            ;;
    esac
fi

内容的提问来源于stack exchange,提问作者Miniex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:57:49