#!/bin/sh # Send message via mail at specified time # myname=`basename $0` # 自分のファイル名を得る usage () { # usageを表示する関数を先頭にしておくと親切 cat<<_EOU_ $myname: 指定した時間に自分にメイルを送る オプションにはこんなんがあるじょー -t ADDRESS メイルを送る追加の宛先(常に自分には送られる) -m "メッセージ" 送信メッセージ 例: $myname +1 1分後にメッセージを送る $myname +5h 5時間後にメッセージを送る $myname +3d 3日後にメッセージを送る $myname 7/15 12:00 7/15の12時に送る (月の省略はできない.時刻を省略すると午前8時) $myname 18:00 今日の18時に送る。既に18時を過ぎてたら明日の18時。 時刻だけ指定して起動するとメッセージ入力を促されるので 日本語でも英語でも何行でも書いて、最後にピリオド(.)一個だけいれておしまい。 _EOU_ exit 0 } # ここからデフォルト変数定義。=(イコール)の前後に空白はだめよ message='' when='' mailto=`whoami` verbose=0 tmpdir=/tmp tmpfile=$tmpdir/$myname-$$ RM=/bin/rm finalize () { # 途中で ^C されたときにやるべき処理 $RM -f $tmpfile # 特に必要なければ書かない echo 'さらばい.' exit 1 } trap finalize 2 3 # 拾うシグナルを列挙 # 関数定義をつらつらと parseResult () { read result echo result="$result" case "$result" in Job*) n=`echo $result|sed 's/^[Jj]ob \([0-9]*\) .*/\1/'` at -l echo "上記 $n 番のジョブとして登録されました。" echo "送信を取り消すときは" echo "% atrm $n" echo "としてください。" ;; *incomplete*|*garbl*) echo "時刻指定がおかしいみたい" echo '' usage ;; *) # ??? ;; esac } register () { [ "$when" = "" ] && when="$@" if [ "$message" = "" ]; then echo "$when に $mailto 宛に送るメッセージを入力してください。" echo "(C-d または . のみの行で終了)" while read l; do [ "$l" = "." ] && break message="$message $l" done fi (cd /; at $when< $tmpfile 2>&1) echo "$message" | nkf | mail -s "Reminder at `LANG=C date`" $mailto EOC cat $tmpfile | parseResult } while [ "$1" != "" ]; do case "$1" in -v) verbose=1 ;; -m) shift; message="$1" ;; -t) shift; mailto="$mailto $1" ;; -h) usage ;; # -h helpオプション --) shift; break ;; +1h) when="now + 1hours" ;; +1d) when="now + 1d" ;; +1) when="now + 1minute" ;; +[0-9]*h) when="now $1ours" ;; +[0-9]*d) when="now $1ays" ;; +[0-9]*) when="now $1minutes" ;; */*) case "$2" in *:*) when="$2 $1" shift ;; '') when="08:00 $1" ;; esac ;; *) break ;; # -で始まらないものが来たら即処理突入 esac shift done # そんでメイン # 引数が一つもなかったらusage表示しておしまい if [ "$1$when" = "" ]; then usage fi register "$@" # おちまい $RM -f $tmpfile exit 0