1

有効期限の 4 週間前に、更新のリマインダー メールを送信したいと考えています。すべての詳細を配列に保存していますが、今日の日付が配列内の日付の 28 日前であるかどうかを確認する方法がわかりません。

これが私がこれまでに得たものです。日付チェックを行う方法についての助けをいただければ幸いです。

#!/bin/sh

adminemail="me@gmail.com"

account[1]="June 03|john@gmail.com|John"
account[2]="April 17|jane@gmail.com|Jane"
account[3]="November 29|sarah@gmail.com|Sarah"

for check in "${account[@]}"
do
    renew=$(echo $check | cut -f1 -d\|)
    email=$(echo $check | cut -f2 -d\|)
    name=$(echo $check | cut -f3 -d\|)

    # check date is 28 days away
    if [ ?????? ]
    then
        subject="Your account is due for renewal"
        text="
Dear $name,

Your account is due for renewal by $renew. blah blah blah"

        echo "$text" | mail -s "$subject" $email -- -r $adminemail
    fi
done
4

2 に答える 2

4

check次のように、日付の 28 日前の月と日付を取得できます。

warning_date=$(date --date='June 03 -28 days' +%s)

同じ形式の現在の日付:

current_date=$(date +%s)

これらは両方とも数値であり、同じスケール (エポックからの秒数) であるため、$current_dateが より大きいかどうかを確認でき$warning_dateます。

if [ $warning_date -lt $current_date ]; then
  # ...
fi

今すぐすべてをまとめてください:

# ...
current_date=$(date +%s)

for check in ${account[@]}; do
  # ...
  renew=$(echo $check | cut -f1 -d\|)

  # 28 days before the account renewal date
  warning_date=$(date --date="$renew -28 days" +%m%d)

  if [ $warning_date -lt $current_date ]; then
    # Set up your email and send it.
  fi
done

アップデート

現在の日付が日付の 28 日前である場合にのみcheck、同じ月の日付形式で各日付を取得し、文字列が等しいかどうかを比較できることに注意してください。

# ...
current_date=$(date "+%B %d")

for check in ${account[@]}; do
  # ...
  renew=$(echo $check | cut -f1 -d\|)

  # The 28th day before the account renewal day
  warning_date=$(date --date="$renew -28 days" "%B %d")

  if [ $warning_date == $current_date ]; then
    # Set up your email and send it.
  fi
done
于 2013-05-23T00:09:49.537 に答える
3

単純な整数であるため、日付の比較には Unix タイムスタンプを使用することをお勧めします。

#!/bin/bash

adminemail="me@gmail.com"

account[1]="June 03|john@gmail.com|John"
account[2]="April 17|jane@gmail.com|Jane"
account[3]="November 29|sarah@gmail.com|Sarah"

for check in "${account[@]}"
do
    IFS="|" read renew email name <<< "$check"

    # GNU date assumed. Similar commands are available for BSD date
    ts=$( date +%s --date "$renew" )
    now=$( date +%s )
    (( ts < now )) && (( ts+=365*24*3600 )) # Check the upcoming date, not the previous

    TMINUS_28_days=$(( ts - 28*24*3600 ))
    TMINUS_29_days=$(( ts - 29*24*3600 ))
    if (( TMINUS_29_days < now && now <  TMINUS_28_days)); then        
        subject="Your account is due for renewal"
        mail -s "$subject" "$email" -- -r "$adminemail" <<EOF
Dear $name,

Your account is due for renewal by $renew. blah blah blah
EOF    
    fi
done
于 2013-05-22T23:56:53.033 に答える