前言
公司各域都有值班制度,安排人处理线上问题
值班排期,工作日一人,周六周日两人(本周和下周的人)
- 例如:本周z值班,下周s值班,下下周x值班,本周六周日z和s值班,下周六周日s和x值班
因为我们值班表是发送到企业微信的群里的,就考虑建个机器人然后写一个脚本来定时发送值班安排
思路:
- 获取文件值班列表和值班总人数
- 根据指针计算当前值班人与下周值班人
- 每周日更改值班安排
- 拼接本周与下周值班人并拼接模板内容
- 每周日更改值班人指针
- 获取机器人地址并发送
- 定时任务
相关点
#获取指定行的内容
nextDuty=$(sed -n "${nextPointer}p" $dutyListPath)
#以|符号分隔为数组
IFS="|"
nextArr=($nextDuty)
#拼接模板内容
notice=$(cat ${noticePath})
temp=$(printf "${notice}" ${currentName} ${currentName} ${nextName} ${namePhone})
#判断当天是否为周日,工作日为1-6,周日为0
if [[ ${currentWeek} -eq 0 ]]; then
#判断字符是否包含某字符
if [[ "{$one}" =~ "no${currentPointer}|" ]]; then
#!/bin/bash
nameAndPhoneList=()
namePhone=""
currentName="" #本周值班人名称
dutyCount=0 #值班总人数
currentPointer=0 #当前值班人
nextPointer=0 #下周值班人指针
robotUrl=""
nextName=""
#获取当前脚本路径
workdir=$(
cd $(dirname $0)
pwd
)
echo "当前工作目录为: ${workdir}"
#读取文件内容并赋值相关变量
prefix=${workdir}
dutyListPath="${prefix}/config/dutyList.txt"
noticePath="${prefix}/config/noticeFormat.txt"
robotUrlPath="${prefix}/config/robotUrl.txt"
currentPath="${prefix}/config/current.txt"
#-----------------初始化姓名与手机---------------------
function initNameAndPhone() {
list=$1
idx=0
OLD_IFS=$IFS
for one in $list; do
#echo "init列表项: ${one}"
#序号|名称|手机|sort|是否值班
line=$one
IFS="|"
arr=($line)
linearr=${arr[@]}
currentName=${arr[1]}
phone=${arr[2]}
nameAndMobile=$(printf "%s:%s" ${currentName} ${phone})
nameAndPhoneList[idx]=$nameAndMobile
idx+=1
done
IFS=$OLD_IFS
}
#-----------------读取值班列表并初始化相关变量---------------------
function initVariable() {
list=$1
list1=$(cat $dutyListPath)
echo "值班列表为: \n$list\n"
#初始化值班列表人名称和手机号
initNameAndPhone "${list1[*]}"
#初始化值班总人数
dutyCount=$(cat $dutyListPath | wc -l)
#初始化微信机器人地址
robotUrl=$(cat $robotUrlPath)
#初始化指针
currentPointer=$(cat ${currentPath})
OLD_IFS=$IFS
for one in $list; do
#echo "列表项: ${one}"
# 当前值班人
if [[ "{$one}" =~ "no${currentPointer}|" ]]; then
line=$one
IFS="|"
arr=($line)
linearr=${arr[@]}
currentName=${arr[1]}
currentSort=${arr[3]}
currentSort=$(expr $currentSort + 1)
nextPointer=${currentSort}
if (($currentSort > $dutyCount)); then
nextPointer=1
fi
#如果是周日 覆盖指针
#覆盖指针
currentWeek=$(date +%w)
echo "今天是星期${currentWeek}"
if [[ ${currentWeek} -eq 0 ]]; then
echo "今天是周日,更改明日值班安排~"
echo $nextPointer >$currentPath
fi
#echo "当前值班人名称: ${currentName}"
break
fi
done
IFS=$OLD_IFS
}
list=$(cat $dutyListPath)
initVariable "${list[@]}"
for a in ${nameAndPhoneList[@]}; do
#echo "a is ${a}"
namePhone="${namePhone}${a}\n"
done
#-----------------获取下周值班人名称---------------------
nextDuty=$(sed -n "${nextPointer}p" $dutyListPath)
OLD_IFS=$IFS
IFS="|"
nextArr=($nextDuty)
nextName=${nextArr[1]}
IFS=$OLD_IFS
#----------------输出信息----------------------
echo "当前值班人名称: ${currentName}"
echo "值班总人数: ${dutyCount}"
echo "下周值班人名称: ${nextName}"
#-----------------开始拼接内容并发送---------------------
notice=$(cat ${noticePath})
temp=$(printf "${notice}" ${currentName} ${currentName} ${nextName} ${namePhone})
curl "${robotUrl}" \
-H 'Content-Type: application/json' \
-d '
{
"msgtype": "text",
"text": {
"content": "'"${temp}"'"
}
}'
效果如下:
标签:arr,IFS,微信,机器人,echo,值班人,currentName,定时,值班 From: https://blog.51cto.com/u_11906056/7062056