bash shell 通過Escape序列設定文字格式

bash shell 通過Escape序列設定文字格式

為了命令列輸出更加有辨識度,shell指令碼需要對輸出進行格式化。例如,藉助escape序列,設定文字的顏色;通過其他ascii控制字元\r,\b等,控制文字的輸出,等等。

Escape序列

escape序列是一個相當古老的ANSI標準,基本所有的Unix/Linux terminal都支援escape序列。escape序列以八進位制\033即ESC的ASCII碼開頭,主要用來控制字型的顏色和其他特徵如閃爍,下劃線等。例如

  • 表示粗體是 \033[1m
  • 表示字型黃色是 \033[33m
  • 表示紅色背景是 \033[41m

舉例1

  1. tput cols 發現當前terminal的列數。tput工具設定或查詢terminal的資訊。
  2. \e[32m 設定文字綠色。\e[31m 設定文字紅色。\e[6C 游標向前跳過6個字元。
  3. echo支援-e選項,\033可寫作\e。

    #!/bin/bash
    print_header() {
    local cols=$(tput cols)
    local word=">>> $1 <<<"
    local skip=6
    echo -n -e "\e[32m"
    local x; for ((x=0; $x<$cols; x  )); do
    echo -n "~"
    done
    echo -e "\r\e[${skip}C\e[31m${word}\n\b\e[0m"
    }
    print_header "第一步"
    echo "some ..."
    print_header "第二步"
    echo "another ..."
    

執行結果如下
執行結果

舉例2

#!/bin/bash
print_header() {
local width=$(tput cols)
local word=">>> $1 <<<"
local skip=4
local x=0
echo -n -e "\e[32;4m"
while (($x < 2 * $width)); do
echo -n " "
((x  ))
[[ $x == $width ]] && echo
done
echo -e "\r\e[${skip}C${word}\n\b\e[0m"
}
print_header "第一步"
echo "some ..."
print_header "第二步"
echo "another ..."

執行結果如圖所示
執行結果2

參考文獻

  1. http://www.unixwerk.eu/unix/ansicodes.html
  2. https://baike.baidu.com/item/ASCII/309296