私のスクリプト出力のこの部分
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ではない)では、2017年5月6日の19:15[[cc]yy]mmddHHMM[.SS]
形式でなければならないと述べています。201705061915
また、実行するコマンドはat
標準入力(または使用されている場合はファイル-f
)から読み取られるため、実行する関数の定義とそれに対する正しい呼び出しを含むシェルスクリプトを提供する必要があります。例:
#/bin/sh
# this is "job.sh"
showRestNotification () {
# ...
}
showRestNotification
次に、
at -f job.sh -t 201705061915
または
at 201705061915 <job.sh
指定されたファイルが実行されるため、at
特定のシェル構成を使用するには、関数定義と呼び出しを含むスクリプトを/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
。