shell编程实践-历史上的今天

功能概述

  • 经过api拉取“历史上的今天”的数据
  • 每次新开一个终端都在顶端显示一个事件
  • 事件展现的顺序应当是从头至尾循环滚动

代码解读

# !bin/bash
# 第一行为固定格式的注释,规定解释该脚本的解释器,bash为默认解释器
# 当使用./xxx的方式执行时会读取该行以固定的解释器执行,若是使用bash xxx的方式则无视第一行
# 默认文件没有执行权限,须要手动添加权限。添加后以./xxx指定当前路径下的xxx文件执行。若是不声明当前路径将会依次从path变量的路径中查找
# 为了实现全局调用,能够经过ln -s 设置软连接到path变量中
source_file_name="today_in_history_source.json"
split_file_name="today_in_history_split"
# 变量声明注意变量名与等号与赋值之间不能有空格。
today_lock_file_name=`date "+%Y.%m.%d".lock`
yesterday_lock_file_name=`date -v-1d "+%Y.%m.%d".lock`
# date是系统命令,显示当前的系统事件,能够设置显示格式。
# 经过-v-1d 指定前一天的时间
# 这里的lock文件用来标示今天是否有拉取过数据

# 从json中读取值
# shell中没有自带的json解析功能,只能经过字符处理手动提取value
function get_json_value(){
    local line=$1
    local key=$2
    local value=`echo "$line" | awk -F"[,:}]" '{for(i=1;i<=NF;i++){if($i~/'${key}'/){print $(i+1)}}}' | tr -d '"'`
    # | 是linux 管道符,用于将命令1的输出转换为命令2的输入,某些命令须要经过 | xargs 才可传递
    # 经过awk分割,遍历每一个字段,经过正则匹配检验key值,将紧随其后的value输出
    # tr 用来删除字符串中的引号
    echo $value
    # shell的函数默认只能返回数字类型,其余类型的输出有两种方式
    # 1:经过echo,调用方获取其输出
    # 2:提早声明全局变量,对其进行赋值
}

# 删除昨日lock文件
rm $yesterday_lock_file_name > /dev/null 2>&1
# > 为重定向,用于将输出从新写到文件等地
# /dev/null是一个不存在的设备标识符,重定向到它会直接丢弃
# 2>&1的含义为将2错误输出与1标准输出一并丢弃

# 若是不存在lock文件拉取今日数据
if [ ! -e $today_lock_file_name ]
# [] 等价 test,用于shell中的判断
# -e 判断是否存在文件
then
    # 删除昨日可能的残留文件
    rm $source_file_name > /dev/null 2>&1
    rm $split_file_name > /dev/null 2>&1
    touch $today_lock_file_name
    touch $source_file_name
    # touch建立新文件
    res=$(curl -s 'https://api.jisuapi.com/todayhistory/query?appkey=76e1addda71b5f25' -H 'Connection: keep-alive' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: zh-CN,zh;q=0.9' -H 'Cookie: Hm_lvt_ff3b9dbe7bb4e4ec2cbf96a59930e5d0=1563683031; Hm_lpvt_ff3b9dbe7bb4e4ec2cbf96a59930e5d0=1563696137' --compressed)
    # 经过curl访问api,请求头是在浏览器中复制而来
    # appkey=?是jisuapi平台为每一个用户设置的密钥
    echo $res > $source_file_name
    # 将输出写入文件
    cat $source_file_name | egrep -o "{\"title.*?<\\\/p>\"}" > $split_file_name
    # 经过正则对返回的事件json数组进行分组,一个事件一行
    # grep 只支持贪婪模式匹配,egrep支持拓展正则语法,经过.*?进行了非贪婪匹配
fi

# 取出第一行
line=`sed -n '1p' "$split_file_name" | egrep -o "\".*\""`
# sed -n '1p' 取出文件第一行
title=`get_json_value "$line" "title"`
year=`get_json_value "$line" "year"`
# 读取json值
echo "[历史上的今天]:${year}年的今天,${title}"
# 进行展现

# 将第一行置换到最后一行,滚动显示
sed -i -e '1d' $split_file_name
# -i -e '1d' 为在原文件直接删除
echo $line >> $split_file_name
# 把删除的这一行从新追加到末尾
# >> 为追加
复制代码

在设置软连接到$PATH后,已经能够经过直接敲文件名调用。经过编写.zshrc在末尾添加命令就能够实现每一个tty都能在顶端自动显示。html

相关文章
相关标签/搜索