Bash

使用“at”命令

  • November 14, 2018

我的腳本輸出的這一部分

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[@]}"
}

你的命令

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

指示準時at執行。${sleepTimes[$i]}``showRestNotification

  1. at時間規範是亂碼,即不是您的系統可辨識的格式。
  2. at從標準輸入(或使用時從文件-f)讀取。

您需要閱讀at系統上的文件以查看時間規範需要採用什麼格式。在我的系統(不是 Linux)上,它說它應該是 format [[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將執行指定的文件,因此如果您想使用-specific shell 構造/bin/sh,您將需要呼叫bash包含函式定義和呼叫的腳本。job.sh``bash


您的程式碼的可移植性提示:

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到處測試。

引用自:https://unix.stackexchange.com/questions/363482