嵌入式Linux下sh脚本wpa_cli特殊字符SSID匹配问题
解决BusyBox sh下wpa_cli识别含特殊字符SSID的问题
你的问题根源在于grep默认将搜索内容当作正则表达式解析,SSID里的特殊字符(如*、[、.等)会被识别成正则元字符,导致匹配失效;同时BusyBox内置sh对ANSI-C转义(比如$'\t')的兼容性有限,需要调整实现逻辑。
修改后的is_known函数如下:
is_known() { local ssid="$1" local tab=$(printf '\t') wpa_cli list_networks | tail -n+2 | grep -F -e "${tab}${ssid}${tab}" | cut -f1 }
关键调整说明:
grep -F固定字符串匹配:启用该选项后,所有特殊字符都会被当作普通文本处理,不会触发正则语法解析,彻底解决特殊字符匹配失效的问题。printf生成制表符:替代$'\t'写法,提升在BusyBox sh下的兼容性(部分老版本BusyBox不支持$'\t'这类ANSI-C转义语法)。- 局部变量封装:用
local定义ssid和tab,避免全局变量污染,同时确保变量值被正确引用,防止分词或扩展错误。
测试时直接传入原始SSID即可,无需手动转义:
is_known '_-!"#$%&'\''()*+,./:;<=>?@[\]^`{|}~'
执行后会正确返回对应的网络ID1。
内容的提问来源于stack exchange,提问作者ThomasK
相关产品推荐
相关产品推荐

