使用“at”命令

使用“at”命令

我的脚本输出的这一部分

at: garbled time 

对于循环中的每个索引,其中showRestNotification是在此调用之前定义的函数

for i in {0..5}
 do
  at ${sleepTimes[$i]} -f showRestNotification 
done

哪里给定

echo ${sleepTimes[0]}

输出看起来像

05/06/17 19:15

如何重新格式化我的变量以便它可以与 at 命令一起使用?然而,我需要留下日期,因为它对我的脚本的功能至关重要。

编辑:

睡眠时间函数

generateSleepTimes()
{
  oldIFS=$IFS
  IFS=: splitTime=(${wakeUpTime##*-})
  wakeUpHours=${splitTime[0]}
  wakeUpMinutes=${splitTime[1]}

  if [[ "$OSTYPE" == "linux-gnu" ]]; then
         currentHours=$(date +'%H')
         currentMinutes=$(date +'%M')
  elif [[ "$OSTYPE" == "darwin"* ]]; then
          currentHours=$(gdate +'%H')
          currentMinutes=$(gdate +'%M')
  fi


  if [[ $wakeUpHours -lt $currentHours ]]; then
        IFS=$oldIFS
        wakeUpTime="$wakeUpTime tomorrow"

  elif [[ $wakeUpHours -eq $currentHours && $wakeUpMinutes -lt $currentMinutes ]]; then
        IFS=$oldIFS
        wakeUpTime="$wakeUpTime tomorrow"

  else
        IFS=$oldIFS

        wakeUpTime="$wakeUpTime today"

  fi

  if [[ "$OSTYPE" == "linux-gnu" ]]; then
          tempTime=$(date -d "$wakeUpTime - 15 minutes" +"%D %H:%M")

  elif [[ "$OSTYPE" == "darwin"* ]]; then
          tempTime=$(gdate -d "$wakeUpTime - 15 minutes" +"%D %H:%M")
  fi

  if [[ "$OSTYPE" == "linux-gnu" ]]; then
          sleepTimes[6]=$(date -d "$tempTime" +"%D %H:%M")

  elif [[ "$OSTYPE" == "darwin"* ]]; then
          sleepTimes[6]=$(gdate -d "$tempTime" +"%D %H:%M")
  fi

  for i in {5..0}
  do
    if [[ "$OSTYPE" == "linux-gnu" ]]; then
            sleepTimes[$i]=$(date -d "${sleepTimes[$i+1]} - 1 hour" +"%D %H:%M")

    elif [[ "$OSTYPE" == "darwin"* ]]; then
            sleepTimes[$i]=$(gdate -d "${sleepTimes[$i+1]} - 1 hour" +"%D %H:%M")
    fi
  done
  echo "${sleepTimes[@]}"
}

答案1

你的命令

at -f ${sleepTimes[$i]} showRestNotification 

指示按时at运行。${sleepTimes[$i]}showRestNotification

  1. at时间规范是乱码,即不是您的系统可识别的格式。
  2. at-f从标准输入读取(或使用时从文件读取)。

您需要阅读at系统上的文档,了解时间规范需要采用什么格式。在我的系统(不是 Linux)上,它说它应该采用格式[[cc]yy]mmddHHMM[.SS],即2017050619155 月 6 日 19:15 2017年。

此外,由于at从标准输入(或使用时从文件-f)读取要运行的命令,因此您必须为其提供一个 shell 脚本,其中包含要运行的函数的定义以及对其的正确调用, 例如:

#/bin/sh

# this is "job.sh"

showRestNotification () {
    # ...
}

showRestNotification

然后,

at -f job.sh -t 201705061915

或者

at 201705061915 <job.sh

由于at将运行指定的文件,如果您想使用特定的 shell 结构,/bin/sh您将需要调用bash包含函数定义和调用的脚本。job.shbash


代码的可移植性提示:

date () {
    case "$OSTYPE" in
      darwin*) command gdate "$@" ;;
      linux*)  command date  "$@" ;;
      *) printf 'Unsupported OS type: %s\n' "$OSTYPE" >&2
         exit 1 ;;
     esac
}

然后只需使用

sleepTimes[$i]="$(date -d "${sleepTimes[$i+1]} - 1 hour" +"%Y%m%d%H%M")"

无需到处测试$OSTYPE

相关内容