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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:33:52