Shell脚本报错:unexpected token 'then'及'elif'问题求助
问题排查与解决
语法错误原因
你的脚本报错是因为Shell的if/elif语法规则:条件表达式闭合后,then必须与if/elif在同一行(用分号分隔),或者在条件行末尾添加反斜杠表示换行延续。你当前的写法中then单独成一行,且条件行末尾没有分号/反斜杠,Shell无法识别then属于if语句的一部分,因此抛出语法错误。
修正后的脚本
while true do # Subscribe to relevant topics mosquitto_sub -h 192.168.1.37 -t "0_0" -t "0_1" | while read -r topic do # 注意:mosquitto_sub是订阅消息,不是监听客户端订阅事件,这里逻辑可能存在误解 echo "Received message from topic: ${topic}" # Check the topic and redirect the subscription if [[ $topic == "0_0" ]]; then mosquitto_sub -h 192.168.30.xxx -t "$topic" # 补充完整IP地址 elif [[ $topic == "0_1" ]]; then mosquitto_sub -h 192.168.25.xxx -t "$topic" # 补充完整IP地址 fi done sleep 10 # Wait 10 seconds until reconnection done
额外注意事项
- IP地址完整性:脚本中
192.168.30和192.168.25是不完整的IP,需要补充最后一段(比如192.168.30.1),否则mosquitto_sub无法连接到正确的MQTT broker。 - 逻辑误区:
mosquitto_sub的作用是订阅并接收指定topic的消息,而非监听客户端的订阅行为。你的注释提到"every time a client subscribes to a topic",如果要实现监听客户端订阅事件,需要使用MQTT的$SYS主题(比如$SYS/broker/subscribes/+/+),或者配置broker开启订阅日志后解析日志,当前脚本逻辑无法实现该需求。
内容的提问来源于stack exchange,提问作者Samuel Mikhael
相关产品推荐
相关产品推荐

