shell輸出與終端寬度相同的重複字符

來自個人筆記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

  • $COLUMNSLINES內置變量
  • tput colstput 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. seq以=爲分隔符生成與終端寬度字符數量相等的數字(形如1=2=3=4
    2. sed正則匹配全部數字並替換爲空字符串。

所以輸出文章開頭舉例的那種一行=也就容易了:

#使用sed+print
printf "%-${COLUMNS}s" "="|sed "s/ /=/g"
#使用seq+sed
 seq -s "=" ${COLUMNS}|sed -E "s/[0-9]//g"
相關文章
相關標籤/搜索