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
相关产品推荐
相关产品推荐

