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

相關文章
相關標籤/搜索