当 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 脚本会发出哔哔声的主要内容,如果未能解决你的问题,请参考以下文章