我的脚本输出的这一部分
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
at
时间规范是乱码,即不是您的系统可识别的格式。at
-f
从标准输入读取(或使用时从文件读取)。
您需要阅读at
系统上的文档,了解时间规范需要采用什么格式。在我的系统(不是 Linux)上,它说它应该采用格式[[cc]yy]mmddHHMM[.SS]
,即201705061915
5 月 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.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
。