"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ではない)では、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呼び出す必要があります。bashjob.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

おすすめ記事