【问题标题】:Bash script to beep when temperature hot on FreeBSD当 FreeBSD 上温度过高时,Bash 脚本会发出哔哔声
【发布时间】: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 声明不起作用。

【问题讨论】:

标签: bash freebsd beep


【解决方案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 和温度测量无关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多