[Shell] Shell + Mac实现日历按记忆曲线设置提醒

邮件方案请见这里

新版本实现一次添加一整系列日历信息,自己生成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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值