我有一个小的关机脚本,如果 Mac 运行超过 24 小时就会关机。我对 bash 脚本没有真正的经验,但我这样做了:
!/bin/bash
#Maximum number of days to be up
max=1
#Get the uptime days and assign it to a variable
uptime_days=`uptime | cut -d " " -f 5`
if [ $uptime_days -ge $max ]
then
shutdown -h now
fi
exit 0
现在我收到此错误消息:
./shutdown: line 9: (: days,: integer expression expected
有人可以帮忙吗?
答案1
这应该适用于 macOS。我们得到启动时间戳,然后是当前时间戳(以秒为单位),然后是一些数学运算,瞧。
#!/bin/bash
BOOT_TIME=$(sysctl -n kern.boottime | sed -e 's/.* sec = \([0-9]*\).*/\1/')
CURR_TIME=$(date +%s)
MAX_UPDAYS=1 #Days
DAYS_UP=$(( ( $CURR_TIME - $BOOT_TIME) / 86400 ))
if [ $DAYS_UP -ge ${MAX_UPDAYS} ];then
shutdown -h now
fi
答案2
脚本中的主要错误cut
应该如下所示:
uptime_days=`uptime | cut -d " " -f 4`
注意5
变成了4
.这是因为剪切选择的是单词days
,而不是它前面的数字。
echo
捕获此类错误的方法是在代码中添加:
echo uptime_days=$uptime_days
所以当输出包含
uptime_days=days,
很明显解析中发生了一些错误。
还有其他一些事情可以改进以避免以后出现问题:
舍邦
脚本的第一行应以 开头,#!
以便内核读取它。无论如何,你的代码都会被 shell 解释,但是如果你以不同的方式运行命令,它可能不会使顶行看起来像
#!/bin/bash
是个好主意。
双括号
在 shell 中使用双括号作为条件语句更不容易出错。您还可以将其移动then
到同一行,如下if
所示:
if [[ $uptime_days -ge $max ]]; then
echo shutdown!
fi
答案3
这是整个脚本:
#!/bin/bash
uptime | grep -q days && shutdown -h now