当 FreeBSD 上温度过高时,Bash 脚本会发出哔哔声

Posted

技术标签:

【中文标题】当 FreeBSD 上温度过高时,Bash 脚本会发出哔哔声【英文标题】:Bash script to beep when temperature hot on FreeBSD 【发布时间】:2018-11-08 16:33:39 【问题描述】:

我一直在编写 Bash 脚本,以便在 PC 过热时发出蜂鸣声。 我已删除哔声以尝试识别问题。 到目前为止我所拥有的:

temp=$(sysctl -n hw.acpi.thermal.tz0.temperature | tr -d 'C')
echo $temp

if ["$temp" -gt "30.1"]
then
   echo "temp hot"
else
   echo "temp ok"
fi

我的输出是

54.1
temp.sh: line 4: [54.1: command not found
temp ok

删除 if 语句只是输出

54.1

所以我认为是 if 声明不起作用。

【问题讨论】:

您应该使用shellcheck.net 检查您的代码,以查找此类语法错误。一旦[ ] 中的间距固定,您的问题就变成***.com/questions/8654051/… 另见***.com/questions/9581064/… 【参考方案1】:

你应该使用双括号 (( )) 来做算术表达式,并且由于 Bash 不能处理十进制值,你只需要删除点(就像你想把它乘以十一样)。

temp=$(sysctl -n hw.acpi.thermal.tz0.temperature | tr -d 'C')
max_temp=50.2

(( $temp//./ > $max_temp//./ )) && echo "temp hot" || echo "temp ok"

确保对两个值使用相同的格式(尤其是前导零,54.10 将变为 5410)。

如果不能保证格式,还有第二种方法,正如 Benjamin W 所提到的,使用bc。您可以向该命令发送一个涉及浮点数的逻辑操作,如果为真则返回 0,否则返回 1。

temp=$(sysctl -n hw.acpi.thermal.tz0.temperature | tr -d 'C')
max_temp=50.2

(( $(echo "$temp > $max_temp" | bc) )) && echo "temp hot" || echo "temp ok"

【讨论】:

只去掉小数点就需要你确切地知道它后面有多少位数。我建议改用bc @benjamin-w 是的,正如我在回答中所说,它假设您知道格式(纯 bash,不需要 bc)。我编辑了答案以提供bc 解决方案。 是否可以选择舍入/截断。它不需要那么准确【参考方案2】:

您的直接问题是语法错误——您省略了命令 ([ -- /bin/[) 与其参数 ($temp) 之间的空格。 [ 的最后一个参数必须是 ] - 你的脚本也缺少一个空格,这使得最后一个参数 "30.1"]。顺便说一句,这里不需要引号,只会让事情更难阅读。

这是一个通用的 sh-scripting quation,它与 FreeBSD 和温度测量无关。

【讨论】:

以上是关于当 FreeBSD 上温度过高时,Bash 脚本会发出哔哔声的主要内容,如果未能解决你的问题,请参考以下文章

esxi openwrt cpu 过高

CPU温度过高!!!!求高手分析原因啊!!!

观察者模式解析

彩扩机项目--散热马达驱动部分

重装了系统后CPU温度过高

windows进程监控脚本