直接在 bash 提示符中使用 if 语句?

直接在 bash 提示符中使用 if 语句?

我不确定这是否可以直接实现。但我试图使用以下方法获取 CPU 的当前温度:

cpu=$(</sys/class/thermal/thermal_zone0/temp)

我想使用 echo 将同一命令的输出通过管道传输到 if 语句,以便在温度高于 70000 时执行关闭。(命令的输出需要除以 1000 以得到摄氏度温度)。

就像是

cpu=$(</sys/class/thermal/thermal_zone0/temp) | if $cpu -gt 70000 then shutdown fi

我试图这样做是为了防止我的圆周率过热。我将安排一个 cronjob 每 15 分钟检查一次 Pi 的 CPU 温度,如果超过 70 则将其关闭。

谢谢。

答案1

你的最后一个命令是几乎正确,但语法错误。更正版本:

cpu=$(</sys/class/thermal/thermal_zone0/temp); if [ "$cpu" -gt 70000 ]; then shutdown; fi

或者,更短一些,

cpu=$(</sys/class/thermal/thermal_zone0/temp); [ "$cpu" -gt 70000 ] && shutdown

或者,更短一些,

[ "$(</sys/class/thermal/thermal_zone0/temp)" -gt 70000 ] && shutdown

您的命令的问题(除了 - 语句的语法之外if)是您使用了管道。管道的右侧(您的if语句)应从管道的左侧(您的变量分配)读取。变量赋值不会产生任何输出,并且您的if- 语句不会消耗任何输入。此外,$cpu由于管道的两个部分是同时执行的,因此管道右侧的值是未知的。

对于 cron 作业,以下可能是更好的命令表述:

[ "$(</sys/class/thermal/thermal_zone0/temp)" -le 70000 ] || shutdown

这样可以确保即使温度较低,命令也能成功退出。该变化将从低温测试[ ... -gt 70000 ] && shutdown中返回非零退出,这会让人认为工作失败。[ ... ]cron

另请注意,这需要使用 crontabbash作为 shell 来运行作业,否则$(<...)语法可能无法正常工作。您可以更改$(<...)$(cat ...)设置SHELL=/bin/bash在 crontab 的顶部。另外,要运行shutdown,您可能需要 root 权限。

相关内容