if 语句中需要整数表达式

if 语句中需要整数表达式

我有一个小的关机脚本,如果 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

相关内容