如何将Mi Flora Python脚本输出转换为Bash脚本变量?
提取Python脚本输出为Bash变量的几种实用方法
这里有几个靠谱的方案,可以把你的Mi Flora脚本输出转换成Bash环境变量,每个方法各有优劣,你可以根据自己的需求选:
方法1:grep+Perl正则快速提取
这个方法简单直观,适合快速搞定单个变量提取。我们可以先把脚本输出存到一个变量里,避免重复执行脚本:
# 先捕获脚本的全部输出 mi_flora_data=$(sudo ./demo.py --backend bluepy poll C4:7C:8D:xx:xx:xx) # 用Perl正则的\K忽略冒号前的内容,直接提取对应值 FW=$(echo "$mi_flora_data" | grep -oP 'FW: \K.*') NAME=$(echo "$mi_flora_data" | grep -oP 'Name: \K.*') TEMPERATURE=$(echo "$mi_flora_data" | grep -oP 'Temperature: \K.*') MOISTURE=$(echo "$mi_flora_data" | grep -oP 'Moisture: \K.*') LIGHT=$(echo "$mi_flora_data" | grep -oP 'Light: \K.*') CONDUCTIVITY=$(echo "$mi_flora_data" | grep -oP 'Conductivity: \K.*') BATTERY=$(echo "$mi_flora_data" | grep -oP 'Battery: \K.*')
想验证变量是否正确设置?直接打印就行:
echo "设备固件版本: $FW" echo "设备名称: $NAME" echo "当前温度: $TEMPERATURE°C"
方法2:while循环逐行处理(更高效)
这个方法只执行一次脚本,逐行解析输出,避免了重复调用脚本的开销,适合频繁使用的场景:
# 捕获输出到变量 mi_flora_data=$(sudo ./demo.py --backend bluepy poll C4:7C:8D:xx:xx:xx) # 用冒号分割每行的键和值,逐个处理 while IFS=':' read -r raw_key raw_value; do # 去掉键和值两边的多余空格 key=$(echo "$raw_key" | xargs) value=$(echo "$raw_value" | xargs) # 根据键名匹配设置变量 case "$key" in "FW") FW="$value" ;; "Name") NAME="$value" ;; "Temperature") TEMPERATURE="$value" ;; "Moisture") MOISTURE="$value" ;; "Light") LIGHT="$value" ;; "Conductivity") CONDUCTIVITY="$value" ;; "Battery") BATTERY="$value" ;; esac done <<< "$mi_flora_data"
方法3:动态声明变量(更灵活)
如果后续脚本可能增加更多输出字段,这个方法可以自动把键名转成大写并设置变量,不用手动逐个写匹配规则:
mi_flora_data=$(sudo ./demo.py --backend bluepy poll C4:7C:8D:xx:xx:xx) # 过滤需要的行,动态生成变量 echo "$mi_flora_data" | grep -E '^(FW|Name|Temperature|Moisture|Light|Conductivity|Battery):' | while IFS=':' read -r raw_key raw_value; do # 键名转大写并去除空格 key=$(echo "$raw_key" | tr '[:lower:]' '[:upper:]' | xargs) # 值去除前后空格 value=$(echo "$raw_value" | xargs) # 动态声明变量 declare "$key=$value" done
小提醒
- 如果你直接用管道连接while循环(不先存到变量),循环里的变量会在子shell中运行,外部无法访问,所以优先推荐先把输出存到变量再处理。
- 确保你的脚本输出格式稳定,键和值始终用冒号分隔,不然得调整分割规则哦。
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

