多年程式設計師總結下來的懶人必備指令碼之進度條⚠️製作

語言: CN / TW / HK

持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第3天,點選檢視活動詳情

製作進度條

  • 最近正在製作一些指令碼方便平時重複的工作。畢竟不能白瞎了自己的mac電腦。製作至於發現別人家的指令碼可都是自帶進度條的。說幹就幹我就準備研究下進度條怎麼搞

image-20220601153829228.png

  • 先看下我們的效果圖

image-20220601154309747.png

image-20220601154326037.png

image-20220601154338137.png

思考

  • 既然是進度條,那麼首先一點我們的輸出肯定是不能換行的。不換行的方式我們可以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

image-20220601154537472.png

  • 很明顯echo -ne在shell裡並沒有搞出來。還請大佬指點
  • 既然這種不行我們就換另外方式。和C語言一樣在Linux中輸出內容也可以利用printf

image-20220601154727571.png

  • 而我們常見的進度條無非這種結構

image-20220601155413814.png

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

image-20220601163245050.png

  • 進度條左側需要從左開始現實我們進度元素,右側作為動畫展示,其中我們可以展示數字化的進度。那麼很自然我們可以將進度條內容格式化為以下內容

printf "%-100s %d%" '#' 1

image-20220601164845885.png

  • 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埠是否啟動成功了。成功之後會立馬將進度條填滿。

\

「其他文章」