多年程式設計師總結下來的懶人必備指令碼之進度條⚠️製作
持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第3天,點選檢視活動詳情
製作進度條
- 最近正在製作一些指令碼方便平時重複的工作。畢竟不能白瞎了自己的mac電腦。製作至於發現別人家的指令碼可都是自帶進度條的。說幹就幹我就準備研究下進度條怎麼搞
- 先看下我們的效果圖
思考
- 既然是進度條,那麼首先一點我們的輸出肯定是不能換行的。不換行的方式我們可以
echo -ne ">"
這樣來。但是我在mac上shell腳本里執行的是這樣的效果
for i in {1..100}
do
echo -ne ">"
echo -ne h
#if [ $i -eq 2 ]
#then
# break
#fi
sleep 1
done
- 很明顯
echo -ne
在shell裡並沒有搞出來。還請大佬指點
- 既然這種不行我們就換另外方式。和C語言一樣在Linux中輸出內容也可以利用
printf
- 而我們常見的進度條無非這種結構
printf
- 我們看看printf在linux中大概有哪些語法
| 命令 | 作用 | 解釋 |
| --------------------------------------------------- | -------- | -------------------- |
| printf "%s\n" "Hello world"
| 輸出內容 | %s作為佔位符,\n作為換行符 |
| printf "\e[1;34m%.3d\e[0m\n" 42
| 輸出一個數字 | \e 表示科學計數法;剩餘表示字型顏色 |
| printf "\u20AC %.2f\n" 123.4
| 輸出浮點數 | 現實字元編碼 浮點數 |
| printf "var1: %s\tvar2: %s\n" "$VAR1" "$VAR2"
| 佔位輸出 | 可以取變數 |
| printf -v myvar "This is %s = %d\n" "a year" 2016
| 將內容儲存到變數 | 該操作在zsh上不支援。我就不看我什麼了 |
- 大概我們將上述常用的四種命令抽象下為
printf "format" content
| 控制字母 | 功 能 | | ----- | ---------------------- | | c | 將一個數作為 ASCII 顯示 | | d | 顯示一個整數值 | | i | 和 d —樣,也是顯示一個整數值 | | e | 用科學計數法顯示一個數 | | f | 顯示一個浮點值 | | g | 用科學計數法或浮點數顯示(選擇較短的格式) | | o | 顯示一個八進位制數 | | s | 顯示一個文字字串 | | x | 顯示一個十六進位制值 | | X | 顯示一個十六進位制值,但使用大寫字母 A~F | | % | 其實符號,不可缺失 | | - | 有 - 表示左對齊輸出,如省略表示右對齊輸出 | | m.n | m表示所佔寬度。n表示內容精度 | | l 或 h | l就是long ; h就是short |
- printf是按照我們空格匹配的。比如說我們執行下面分別匹配四次
printf "%s\n" a b c d
- 進度條左側需要從左開始現實我們進度元素,右側作為動畫展示,其中我們可以展示數字化的進度。那麼很自然我們可以將進度條內容格式化為以下內容
printf "%-100s %d%" '#' 1
- linux命令這樣操作;但是shell腳本里需要稍微改動點
printf "[%-25s][%d%%][%c]\r"
實戰
- 理論知識準備好了之後呢?我們開始實戰模擬,我打算製作一個專案啟動的進度條。前置條件就是通過ssh 或者sshpass命令遠端啟動指令碼。然後通過進度條取檢測服務是否正常啟動並運行了。這裡我們就不僅僅在進度條裡做進度渲染了還得去查詢對應的服務埠是否啟動了。
- 這裡的進度條只能是一種模擬的進度條,我們只能認為服務正在啟動然後檢測到埠後就立馬到100% 。 這裡我們需要預留服務啟動的時間。我們按照這個時間去做進度條的載入。
- 上面已經知道實際是通過
printf
來完成進度渲染。那麼服務埠的檢測該怎麼來實現呢?這裡就需要扯出linux有一大利器awk.關於awk我們油專門章節梳理。下面直接運用
lsof -i:8080 | awk -F "[ ]+" 'NR>1{print $2}'
- 基於上面的命令我們就能完成進度條了。
#!/bin/bash
i=0
str='#'
ch=('|' '' '-' '/')
index=0
while [ $i -le 25 ]
do
printf "[%-25s][%d%%][%c]\r" $str $(($i*4)) ${ch[$index]}
str+='#'
let i++
let index=i%4
pid=`lsof -i:8080 | awk -F "[ ]+" 'NR>1{print $2}'`
if [[ -n $pid ]]
then
i=25;
str=#########################
fi
sleep 1
done
printf "\n"
echo "安裝完成
- 進度條在渲染的過程中會不停的檢測8080埠是否啟動成功了。成功之後會立馬將進度條填滿。
\
- 避免回表,引入索引下推|提高索引命中率 | 提前下班啦
- TDengine 時序性資料庫為什麼海量資料下不卡頓呢
- 神奇的XPath,快速完成前端及XML的元素定位,茫茫大海不迷路
- springboot通用分支處理---還在硬編碼特殊處理邏輯?超級管理員不應該被區別對待
- Spring事務太強大了,相容資料庫同時給我們提供多種組合應對業務需求
- java物件在記憶體中如何分佈 | java上鎖原來就是記憶體佔位,so easy
- linux三劍客之編輯器sed出廠
- linux三劍客awk教你如何裁剪結果集
- 執行緒池7個引數拿捏死死的,完爆面試官
- 執行緒池存在的意義
- 多年程式設計師總結下來的懶人必備指令碼之進度條⚠️製作
- java中的static關鍵字說清楚還得靠JVM
- 設計模式存在哪些關聯關係,六種關係傻傻分不清--- UML圖示詳解
- 每次需求評審產品總是讓我提高程式碼複用,說白了就是合成複用原則
- 越級上報不可行,各司其職才是王道---迪米特法則
- 偏向鎖/輕量鎖/重級鎖鎖鎖更健康,上鎖解鎖到底是怎麼完成實現的,我來告訴你
- 狸貓換太子里氏替換原則;不要一味的進行抽象否則最後你無法hold你的物件
- 設計模式是我擺脫碼畜的唯一出路---依賴倒轉原則
- 學好數理化,寫遍所有程式碼都不怕,我用數學分類討論的思想解決
- synchronized已經不在臃腫了,放下對他的成見之初識輕量級鎖