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

如何在Bash脚本中提取字符串数字?优化树莓派3温度检测脚本

解决树莓派温度监控脚本的数字提取与背景色设置问题

嘿,我来帮你搞定这个树莓派温度监控的问题!首先先指出你现有脚本里的一个小笔误——第二个elif分支里的put setab 3少打了个t,应该是tput setab 3,这个不修正的话运行到该分支会报错。

另外,你当前用vcgencmd measure_temp | cut -d= -f 2 | cut -d\' -f 1已经成功提取了温度的数字部分,但要注意:Bash本身只支持整数比较,而树莓派返回的温度是带小数的(比如65.5),如果直接用-ge这类整数运算符,Bash会把小数截断成整数处理(比如65.5会被当成65),导致判断逻辑不准确。下面是修正并优化后的脚本,改用bc工具处理浮点数比较:

#!/bin/bash
measurement() {
    i=1
    echo "Reading Temperature"
    echo "Updating time is set to $1"
    while [ $i -eq 1 ]; do
        # 提取温度数字(包含小数)
        temp="$(vcgencmd measure_temp | cut -d= -f 2 | cut -d\' -f 1)"
        tput setaf 7  # 设置前景色为白色
        
        # 用bc处理浮点数比较,返回1为真,0为假
        if [[ $(echo "$temp >= 70" | bc -l) -eq 1 ]]; then
            tput setab 1  # 红色背景
            echo -ne "Temperature = $temp\r"
        elif [[ $(echo "$temp >= 65 && $temp < 70" | bc -l) -eq 1 ]]; then
            tput setab 3  # 黄色背景
            echo -ne "Temperature = $temp\r"
        elif [[ $(echo "$temp >= 60 && $temp < 65" | bc -l) -eq 1 ]]; then
            tput setab 2  # 绿色背景
            echo -ne "Temperature = $temp\r"
        elif [[ $(echo "$temp >= 55 && $temp < 60" | bc -l) -eq 1 ]]; then
            tput setab 6  # 青色背景
            echo -ne "Temperature = $temp\r"
        else
            tput setab 4  # 蓝色背景
            echo -ne "Temperature = $temp\r"
        fi
        sleep $1
    done
}
if [ -n "$1" ]; then
    sleep_time=$1
    measurement $sleep_time
else
    read -p "Enter the Update Time: " sleep_time
    measurement $sleep_time
fi

接下来给你详细讲讲在Bash脚本中提取字符串数字的几种常用方法:

方法1:使用cut命令(你当前在用的方法)

适合字符串格式固定的场景,比如vcgencmd的输出格式是temp=XX.X'C,可以通过指定分隔符来提取:

# 第一步:以=为分隔符,取第2部分,得到"XX.X'C"
vcgencmd measure_temp | cut -d= -f2
# 第二步:以'为分隔符,取第1部分,得到纯数字"XX.X"
vcgencmd measure_temp | cut -d= -f2 | cut -d\' -f1

方法2:使用sed命令替换非数字字符

通过正则表达式替换掉所有非数字和小数点的字符,直接提取数字部分:

vcgencmd measure_temp | sed 's/[^0-9.]//g'

解释:s/[^0-9.]//g表示全局替换所有不是数字(0-9)和小数点(.)的字符为空。

方法3:使用grep命令匹配数字模式

利用grep的-o参数只输出匹配的部分,结合正则表达式匹配数字和小数点的组合:

vcgencmd measure_temp | grep -oE '[0-9.]+'

解释:-o表示只输出匹配的片段,-E启用扩展正则,[0-9.]+匹配一个或多个数字或小数点。

方法4:使用Bash参数扩展

如果已经把字符串存到变量里,可以直接用Bash的参数替换功能去掉非数字字符:

output=$(vcgencmd measure_temp)
temp=${output//[^0-9.]/}
echo $temp

解释:${output//[^0-9.]/}表示把output变量中所有非数字和小数点的字符替换为空。

内容的提问来源于stack exchange,提问作者user9156891

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:08:44