來自個人筆記linux
咱們有時候但願輸出與當前終端寬度相等(或成正比)的重複字符,通常用做分隔、提示等,說白了就是好看或易於辨識一點點,例如使用yum安裝軟件時的那一排=
,老是恰好排滿一行,不會多不會少git
Dependencies Resolved =============================================================================== Package Arch Version Repository Size =============================================================================== Reinstalling: vim-enhanced x86_64 2:7.4.160-5.el7 os 1.0 M Transaction Summary =============================================================================== Reinstall 1 Package
這個功能的實現的兩個重點:github
終端以單個字符爲基本「單位」,終端中一行能輸入多少個字符,該行就能劃分紅多少列(columns),也就是該行有多「寬」,「高度」亦同,即當前終端能劃分紅多少行(lines)。
咱們可使用如下方法獲取終端的列數(寬)和行數(高):shell
$COLUMNS
和LINES
內置變量tput cols
和tput lines
stty size
(輸出兩個數字,以空格分開,前面爲行數--高,後面爲列數-寬)這裏咱們以單個字符=
爲例,實現輸出10個連續的=
即==========
重複輸出一個字符vim
使用printfcode
s=$(printf "%-10s" "=") echo -e "${s// /=}" #或 #sed "s/ /=/g" #printf "%-10s" "="|sed "s/ /=/g"
prints前面的10表示佔用10個字符寬度,-
表示左對齊(沒有該符號表示右對齊),%s
沒必要說,就是不少語言中的佔位符號,s表示string類型(不過把寬度10寫到裏面真是。。。)
所以print語句就是佔用10個字符的寬度,以=
字符串填充,不過只有一個=
所以其實是1個+9個空格佔位=
ci
再將9個空格替換成=
字符串
使用seq
seq做用是連續輸出指定的數字,用法:get
seq [選項]... 尾數
seq [選項]... 首數 尾數
seq [選項]... 首數 增量 尾數
默認的,seq以\n
爲分隔符,每行輸出一個數字,若是不指定首數,則首數爲1,若是不指定增量,則增量也爲1。string
seq 3 #這裏只寫了一個數字,則改數字就被看成尾數 也就是終止的數字
輸出
1
2
3
seq -s "=" 10|sed -E "s/[0-9]//g"
=
爲分隔符生成與終端寬度字符數量相等的數字(形如1=2=3=4
)所以輸出文章開頭舉例的那種一行=
也就容易了:
#使用sed+print printf "%-${COLUMNS}s" "="|sed "s/ /=/g" #使用seq+sed seq -s "=" ${COLUMNS}|sed -E "s/[0-9]//g"