如何在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
相关产品推荐
相关产品推荐

