編寫shell指令碼的時候,通過改變shell的顯示顏色,不但能夠改變使用shell終端的體驗,而且更為實用的是,能夠通過改變顯示內容的顏色來區分正常輸出,warning和error等不同關注層級的輸出內容。
1、逸出序列(Escape sequence)
An escape sequence is a series of characters used to change the state of computers and their attached peripheral devices. These are also known as control sequences, reflecting their use in device control. Some control sequences are special characters that always have the same meaning. Escape sequences use an escape character to change the meaning of the characters which follow it, meaning that the characters can be interpreted as a command to be executed rather than as data.
簡單地說,就是逸出序列能夠改變電腦和外設的狀態。這裡用的就是利用逸出字元來改變顯示器的顯示顏色。
2、echo命令
echo命令中有-e選項,通過這個選項,可以在該條命令中開啟對反斜線轉義的解釋,後面的選項中追加適當的逸出序列可以改變echo命令輸出的顯示顏色。echo中文字顯示顏色相關的參數主要有三個Style,Frontground和Background,每個參數有7個值具體的格式如下:
Style Foreground Background1st Digit 2nd Digit 3rd Digit0 - Reset 30 - Black 40 - Black1 - FG Bright 31 - Red 41 - Red2 - Unknown 32 - Green 42 - Green3 - Unknown 33 - Yellow 43 - Yellow4 - Underline 34 - Blue 44 - Blue5 - BG Bright 35 - Magenta 45 - Magenta(洋紅色)6 - Unknown 36 - Cyan 46 - Cyan(藍綠色)7 - Reverse 37 - White 47 - White
通過將命令echo -e "\e[Style;Foreground;BackgroundmTHINGSTOPRINT"中的Style、Foreground和Background換成上面的數字就可以改變後面THINGSTOPRINT的顯示顏色。比如,$ echo -e "\e[1;32;43mHello World! "的運行結果1。
圖1
註:這裡之所以Hello World!最後的歎號後面加一個空格,是因為unix shell中歎號是保留字元,用來調用曆史命令。比如!cmd就執行上一條執行過的cmd開頭的命令,而!cmd:p則是只是將上一條cmd開頭的命令喚出顯示出來,而不執行。
可以發現這樣的話,後續所有行的shell顯示顏色都會被改變,這往往不是我們想要的,所以一般來說,我們會在這種命令的末尾將這些顯示設定給Reset。同時,為了不被上一次命令影響,也會在之前設定style的值來進行開始設定之前的reset。(當然,如果要將style設定成underline或者FGorBG Bright之類的值得時候,就沒法在開始設定之前進行reset了,但是,最後的reset是無論如何都是必要的,除非你想接下來所有的顯示一直採用當前的設定。)下面幾條命令的運行結果如2。
命令:
echo -e "\e[1;32;43mHello World! \e[0m" echo -e "\e[0;32;43mHello World! \e[0m" echo -e "\e[4;32;43mHello World! \e[0m" echo -e "\e[5;32;43mHello World! \e[0m"
圖2 運行結果
3、列印所有顯示效果的指令碼
指令碼test.sh的內容:#/bin/bashfor TYLE in 0 1 2 3 4 5 6 7; do for FG in 30 31 32 33 34 35 36 37; do for BG in 40 41 42 43 44 45 46 47; do CTRL="\033[${STYLE};${FG};${BG}m" echo -en "${CTRL}" echo -n "${STYLE};${FG};${BG}" echo -en "\033[0m" done echo done echodone#Resetecho -e "\033[0m"
註:這裡改指令碼中用到了echo的-n選項,它的作用就是控制不要再輸出內容的後面追加換行,與之對應的只有一個echo的命令就是簡單地輸出一個空行,達到換行的目的。
sh test.sh運行該指令碼,就可以看到彩虹般的結果,3(結果有點長,這裡只截取了一部分)。
圖3 彩虹