邮件方案请见这里
新版本实现一次添加一整系列日历信息,自己生成ics文件,结合小米手机Caldav帐号导入icloud日历,实现电脑与手机的日历同步!
较上版本优化点:1. 一次添加多信息,不需要重复回车,间接解决了回车失败的bug;2. 结合Caldav,不需要使用谷歌日历作为中转(此为小米新增功能,与脚本无关)
#!/bin/bash
# 系统回车
function addics(){
osascript 1> /dev/null <<EOF
tell application "Calendar"
activate
delay 1
end tell
EOF
open -a /System/Applications/Calendar.app/ ${1} &&
osascript 1> /dev/null <<EOF
tell application "System Events" to tell process "日历"
delay 0.5
key code 36
end tell
EOF
}
# 关闭日历
function close(){
osascript 1> /dev/null <<EOF
tell application "System Events" to tell process "日历"
click button 1 of window 1
end tell
EOF
}
function listCt() {
# 下边是自动化设置的开始、结束时间
local tempDate
if [[ ${sdt} -lt 0 ]]; then
sdt=$((-sdt))
tempDate=`date -v-"$[sdt]d" +"%Y%m%d"`
else
tempDate=`date -v+"$[sdt]d" +"%Y%m%d"`
fi
first=`date +${tempDate}"073000"`
second=`date +${tempDate}"193000"`
third=`date -v+1d -ujf "%Y%m%d%H%M%S" ${tempDate}"193000" +%Y%m%d%H%M%S`
fourth=`date -v+3d -ujf "%Y%m%d%H%M%S" ${tempDate}"193000" +%Y%m%d%H%M%S`
fifth=`date -v+6d -ujf "%Y%m%d%H%M%S" ${tempDate}"193000" +%Y%m%d%H%M%S`
sixth=`date -v+14d -ujf "%Y%m%d%H%M%S" ${tempDate}"193000" +%Y%m%d%H%M%S`
seventh=`date -v+29d -ujf "%Y%m%d%H%M%S" ${tempDate}"193000" +%Y%m%d%H%M%S`
eighth=`date -v+89d -ujf "%Y%m%d%H%M%S" ${tempDate}"193000" +%Y%m%d%H%M%S`
ninth=`date -v+179d -ujf "%Y%m%d%H%M%S" ${tempDate}"193000" +%Y%m%d%H%M%S`
timeLis=(${first} ${second} ${third} ${fourth} ${fifth} ${sixth} ${seventh} ${eighth} ${ninth})
}
# 创立时间表
function createCalendar(){
local temp
dtstart=${1}
# 切分时间加上T
dtstart=${dtstart: 0: 8}'T'${dtstart: 8}
if [[ -z ${2} ]]; then
# 一言不合加1小时
dtend=`date -v+2H -ujf "%Y%m%dT%H%M%S" ${dtstart} +%Y%m%dT%H%M%S`
else
temp=${2}
dtend=${temp: 0 : 8}'T'${temp: 8}
fi
# echo ${dtstart}
printf "BEGIN:VEVENT\nSUMMARY:${sum}\nDTSTART;TZID=Asia/Shanghai:${dtstart}
DTEND;TZID=Asia/Shanghai:${dtend}\nDESCRIPTION:${desc}\nBEGIN:VALARM\nTRIGGER:PT0S\nACTION:DISPLAY
END:VALARM\nEND:VEVENT\n\n" >> ${icsFile}
}
# 判断当前环境是否安装了以下工具
function judgeEnv(){
# 判断是否安装gnu-sed,没装装上
gsed > /dev/null 2>&1
if [[ $? -eq 127 ]]; then
brew install gnu-sed
fi
# 判断是否安装dos2unix,没装装上
dos2unix -h > /dev/null 2>&1
if [[ $? -eq 127 ]]; then
brew install dos2unix
fi
}
function mmCv() {
read -p '事件标题:' sum
if [[ ! -z $1 ]]; then
read -p '起始时间:' dtstart
read -p '结束时间:' dtend
fi
read -p '备注:' desc
# 自定义起始时间
if [[ -z $1 ]]; then
echo '下一次复习时间,默认值为1(明天)'
read -p '起始时间(1):' sdt
# 设置默认值为1
sdt=${sdt:-1}
fi
# 让名称、描述支持空格
sum=`echo ${sum}| gsed 's/ /\ /g'`
desc=`echo ${desc}| gsed 's/ /\ /g'`
}
function addHT() {
if [[ ${1} == "head" ]]; then
printf "BEGIN:VCALENDAR\n\nBEGIN:VTIMEZONE\nTZID:Asia/Shanghai\nEND:VTIMEZONE\n\n" > ${icsFile}
elif [[ ${1} == "tail" ]]; then
printf "END:VCALENDAR\n" >> ${icsFile}
else
printf "\033[01;31m输入参数有误\033[0m"
fi
}
function write() {
# 去除保存后文档末尾的
dos2unix ${icsFile} > /dev/null 2>&1
# 写入日历
addics ${icsFile}
sleep 0.1
}
##############################################################################
# 设置全局变量
export sdt sum dtstart dtend desc curPath icsFile
curPath=$(cd $(dirname $0); pwd)
icsFile=${curPath}"/reminder.ics"
#> ${icsFile}
# 引用工具检查函数
judgeEnv
# 获取输入信息
echo "\033[43m注意\033[0m"
cat <<EOF
1、这个脚本和reminder.ics必须放在同一个目录下
2、谷歌日历不支持ics更新,要写错得手动修改
3、提示:请活用日历的搜索功能(・ω < )★
EOF
# 选择列表
selection=("记忆曲线" "自定时间" "退出")
select j in ${selection[@]}; do
case ${j} in
记忆曲线 )
addHT head
# 输入
mmCv
# 日期列表创建
listCt
# 基于日期列表,循环调用
for j in ${timeLis[@]}; do
createCalendar ${j}
done
addHT tail
write
# close
;;
自定时间 )
addHT head
dateFormat=`date +"%Y%m%d%H%M%S"`
echo '日期格式:'${dateFormat}
# 带参数调用,参数无所谓是啥
mmCv 666
createCalendar ${dtstart} ${dtend}
addHT tail
write
# close
;;
退出 )
exit 0
;;
esac
done
unset sdt sum dtstart dtend desc curPath icsFile
以下是老版本
提醒还可经由谷歌日历或其它可与手机同步日历服务配合,让手机发出日历提醒
另外需要配合使用的ics文件放在文末
#!/bin/bash
# 系统回车
function addics(){
if [ $pin -eq 1 ]; then
osascript 1> /dev/null <<EOF
tell application "Calendar"
activate
delay 0.2
end tell
EOF
((pin++))
fi
open -a /Applications/Calendar.app/ $1 &&
osascript 1> /dev/null <<EOF
tell application "System Events" to tell process "日历"
key code 36
end tell
EOF
}
# 关闭日历
function close(){
osascript 1> /dev/null <<EOF
tell application "System Events" to tell process "日历"
click button 1 of window 1
end tell
EOF
}
function listCt() {
# 下边是自动化设置的开始、结束时间
local tempDate
if [ $sdt -lt 0 ]; then
sdt=$((-sdt))
tempDate=`date -v-"$[sdt]d" +"%Y%m%d"`
else
tempDate=`date -v+"$[sdt]d" +"%Y%m%d"`
fi
first=`date +$tempDate"0800"`
second=`date +$tempDate"2100"`
third=`date -v+1d -ujf "%Y%m%d%H%M" $tempDate"2100" +%Y%m%d%H%M`
fourth=`date -v+3d -ujf "%Y%m%d%H%M" $tempDate"2100" +%Y%m%d%H%M`
fifth=`date -v+6d -ujf "%Y%m%d%H%M" $tempDate"2100" +%Y%m%d%H%M`
sixth=`date -v+14d -ujf "%Y%m%d%H%M" $tempDate"2100" +%Y%m%d%H%M`
seventh=`date -v+29d -ujf "%Y%m%d%H%M" $tempDate"2100" +%Y%m%d%H%M`
eighth=`date -v+89d -ujf "%Y%m%d%H%M" $tempDate"2100" +%Y%m%d%H%M`
ninth=`date -v+179d -ujf "%Y%m%d%H%M" $tempDate"2100" +%Y%m%d%H%M`
timeLis=($first $second $third $fourth $fifth $sixth $seventh $eighth $ninth)
}
# 创立时间表
function createCalendar(){
local temp
dtstart=$1
# 切分时间加上T
dtstart=${dtstart: 0: 8}'T'${dtstart: 8}
if [ -z $2 ]; then
# 一言不合加1小时
dtend=`date -v+1H -ujf "%Y%m%dT%H%M" $dtstart +%Y%m%dT%H%M`
else
temp=$2
dtend=${temp: 0 : 8}'T'${temp: 8}
fi
# 修改ics文件
gsed -i "31c SUMMARY:$sum" /Users/kelvinchi/Desktop/python/script/reminder.ics
gsed -i "28c DESCRIPTION:$desc" /Users/kelvinchi/Desktop/python/script/reminder.ics
gsed -i '33c DTSTART;TZID=Asia/Shanghai:'$dtstart'00' /Users/kelvinchi/Desktop/python/script/reminder.ics
gsed -i '25c DTEND;TZID=Asia/Shanghai:'$dtend'00' /Users/kelvinchi/Desktop/python/script/reminder.ics
# 获取当前时间
created=`date +"%Y%m%dT%H%M%SZ"`
gsed -i '27c DTSTAMP:'$created /Users/kelvinchi/Desktop/python/script/reminder.ics
gsed -i '34c CREATED:'$created /Users/kelvinchi/Desktop/python/script/reminder.ics
# 去除保存后文档末尾的
dos2unix /Users/kelvinchi/Desktop/python/script/reminder.ics > /dev/null 2>&1
# 写入日历
addics /Users/kelvinchi/Desktop/python/script/reminder.ics
sleep 0.1
}
# 判断当前环境是否安装了以下工具
function judgeEnv(){
# 判断是否安装gnu-sed,没装装上
gsed > /dev/null 2>&1
if [ $? -eq 127 ]; then
brew install gnu-sed
fi
# 判断是否安装dos2unix,没装装上
dos2unix -h > /dev/null 2>&1
if [ $? -eq 127 ]; then
brew install dos2unix
fi
}
function mmCv() {
read -p '事件标题:' sum
if [ ! -z $1 ]; then
read -p '起始时间:' dtstart
read -p '结束时间:' dtend
fi
read -p '备注:' desc
# 自定义起始时间
if [ -z $1 ]; then
echo '下一次复习时间,默认值为1(明天)'
read -p '起始时间(1):' sdt
# 设置默认值为1
sdt=${sdt:-1}
fi
# 让名称、描述支持空格
temp='\\'
sum=`gsed 's/ /'$temp' /g' <<EOF
$sum
EOF`
desc=`gsed 's/ /'$temp' /g' <<EOF
$desc
EOF`
}
##############################################################################
# 引用工具检查函数
judgeEnv
# 第一次打开需要等待
pin=1
# 获取输入信息
echo '\033[43m注意\033[0m'
cat <<EOF
1、这个脚本和reminder.ics必须放在同一个目录下
2、谷歌日历不支持ics更新,要写错得手动修改
3、提示:请活用日历的搜索功能(・ω < )★
EOF
# 选择列表
selection=("记忆曲线" "自定时间" "退出")
select i in ${selection[@]}; do
case $i in
记忆曲线 )
# 输入
mmCv
# 日期列表创建
listCt
# 基于日期列表,循环调用
for i in ${timeLis[@]}; do
createCalendar $i
done
# close
;;
自定时间 )
dateFormat=`date +"%Y%m%d%H%M"`
echo '日期格式:'$dateFormat
# 带参数调用,参数无所谓是啥
mmCv 666
createCalendar $dtstart $dtend
# close
;;
退出 )
exit
;;
esac
done
以下是ics文件,通过它来实现日历更新
BEGIN:VCALENDAR
CALSCALE:GREGORIAN
VERSION:2.0
METHOD:PUBLISH
PRODID:-//Apple Inc.//Mac OS X 10.14.6//EN
BEGIN:VTIMEZONE
TZID:Asia/Shanghai
BEGIN:STANDARD
TZOFFSETFROM:+0900
RRULE:FREQ=YEARLY;UNTIL=19910914T170000Z;BYMONTH=9;BYDAY=3SU
DTSTART:19890917T020000
TZNAME:GMT+8
TZOFFSETTO:+0800
END:STANDARD
BEGIN:DAYLIGHT
TZOFFSETFROM:+0800
DTSTART:19910414T020000
TZNAME:GMT+8
TZOFFSETTO:+0900
RDATE:19910414T020000
END:DAYLIGHT
END:VTIMEZONE
BEGIN:VEVENT
TRANSP:OPAQUE
DTEND;TZID=Asia/Shanghai:20200622T220000
X-APPLE-TRAVEL-ADVISORY-BEHAVIOR:DISABLED
DTSTAMP:20191226T141204Z
DESCRIPTION:XMind
STATUS:CONFIRMED
SEQUENCE:0
SUMMARY:Scala
LAST-MODIFIED:20191029T132129Z
DTSTART;TZID=Asia/Shanghai:20200622T210000
CREATED:20191226T141204Z
X-APPLE-TRAVEL-ADVISORY-BEHAVIOR:DISABLED
BEGIN:VALARM
TRIGGER:PT0S
ACTION:DISPLAY
END:VALARM
END:VEVENT
END:VCALENDAR