shell之echo與printf和顏色

在用戶的bashrc中添加一行export來修改提示符。html

echo printf
printf命令模仿C程序庫(library)裏的printf()庫程序(library routine)。它幾乎複製了
該函數的全部功能。不過在Shell層級的版本上,會有些差別。因爲printf的行爲是由POSIX
標準所定義,所以使用printf的腳本比使用echo移植性好。
如同echo命令,printf命令能夠輸出簡單的字符串:
[root@master ~]#printf "Hello, Shell\n"
Hello, Shell
[root@master ~]#
你應該能夠立刻發現,最大的不一樣在於:printf不像echo那樣會自動提供一個換行符號。你必須顯式
地將換行符號指定成\n。
echo -n "Enter your name:" //參數-n的做用是不換行,echo默認是換行
要使轉義符生效,需加參數-elinux

# echo輸出顏色文本
echo命令改變樣式,以輸出不一樣顏色的文本,必須有 -e 選項(開啓echo中的轉義)。shell


在echo命令輸出以後附加換行,可使用\n選項:
$ cat >echo
#!/bin/bash
echo -e "this echo's 2 new lines\n\n"
echo "OK"
echo "The log files have all been done"
echo "$LOGNAME carried them out at `date`"
echo "\"/dev/rmt0"\"vim

echo "/dev/rmt0"
/dev/rmt0
echo "\"/dev/rmt0\""
"/dev/rmt0"bash

菜單顯示,沒必要多個echo一行行顯示,能夠一整個echo函數

echo "===========================================
|           ** unix script test              |
|           1 --- num 1                       |
|           2 --- num 2                       |
|           3 --- num 3                       |
|           4 --- num 4                       |
==============================================="
工具

事實上,echo 除了 -n options 以外,經常使用選項還有:
-e :啓用反斜線控制字符的轉換(參考下表)
-E :關閉反斜線控制字符的轉換(預設如此)
-n :取消行末之換行符號(與 -e 選項下的 c 字符贊成)測試

 

3.1.2.4 ANSI-C Quoting
Words of the form $'string' are treated specially. The word expands to string, with backslash-escaped characters replaced as specified by the ANSI C standard. Backslash escape sequences, if present, are decoded as follows:
\a
    alert (bell)
\b
    backspace 字體

前面講到,包圍在單引號以內的字符都不會有特殊含義,因此單引號自己並不能在一對單引號中出現。可是在前面加上$以後,就可使用\進行轉義了,\的轉義含義與C語言中的相同。this

關於 echo 命令所支持的反斜線控制字符以下表:
\a:ALERT / BELL (從系統喇叭送出鈴聲)
\b:BACKSPACE ,也就是向左刪除鍵
\c:取消行末之換行符號
\E:ESCAPE,跳脫鍵
\f:FORMFEED,換頁字符
\n:NEWLINE,換行字符
\r:RETURN,回車鍵
\t:TAB,表格跳位鍵
\v:VERTICAL TAB,垂直表格跳位鍵
:ASCII 八進位編碼(以 x 開首爲十六進制) :反斜線自己
$ echo -e "a\tb\tc\nd\te\tf"
a b c
d e f

上例運用 \t 來區隔 abc 還有 def ,及用\n 將 def 換至下一行。

例二:

$ echo -e "\141\011\142\011\143\012\144\011\145\011\146"
a b c
d e f

與例一的結果同樣,只是使用 ASCII 八進位編碼。

例三:

$ echo -e "\x61\x09\x62\x09\x63\x0a\x64\x09\x65\x09\x66"
a b c
d e f

與例二差很少,只是此次換用 ASCII 十六進制編碼。
測試變量是否已經設置
有時要測試是否已設置或初始化變量。若是未設置或初始化,就可使用另外一值。此命令格式爲:
$ { v a r i a b l e : - v a l u e }
意即若是設置了變量值,則使用它,若是未設置,則取新值。例如:
$ COLOUR=blue
$ echo "The sky is ${COLOR:-grey} today"
The sky is grey today
變量c o l o u r取值b l u e,e c h o打印變量c o l o u r時,首先查看其是否已賦值,若是查到,則使
用該值。變量$COLOR沒有設置,因此會打印後面的grey

上面的例子並無將實際值傳給變量,需使用下述命令完成此功能:
$ { v a r i a b l e : = v a l u e }
下面是一個更實用的例子。查詢工資清單應用的運行時間及清單類型。在運行時間及類
型輸入時,敲回車鍵代表用戶並無設置兩個變量值,將使用缺省值( 0 3 : 0 0和We e k l y),並
傳入a t命令中以按時啓動做業。
#!/bin/bash
# vartest
echo "what time do you wish start the payroll [03:00]:"
read TIME
echo " process to start at ${TIME:=03:00} OK"
echo "Is it a monthly or weekly run [Weekly]:"
read RUN_TYPE
echo "Run type is ${RUN_TYPE:=Weekly}'
at -f $RUN_TYPE $TIME
在輸入域敲回車鍵,輸出結果以下:
what time do you wish start the payroll [03:00]:

process to start at 03:00 OK
Is it a monthly or weekly run [Weekly]:

Run type is Weekly

 

在使用putty、secureCRT、XShell等終端仿真器鏈接linux系統時,ls、vim等工具的輸出都含有各類顏色,這些顏色的輸出大大地加強了文本的可讀性。
一般咱們可使用echo命令加-e選項輸出各類顏色的文本,例如:echo -e "\033[31mRed Text\033[0m",能夠輸出紅色的字體「Red Text」。其中:"\033[31m"和"\033[0m"是ANSI轉義序列(ANSI escape code/sequence),它控制文本輸出的格式、顏色等,大多數的類unix終端仿真器都可以解釋ANSI轉義序列。
 
1. ANSI顏色序列格式
通用的控制文本顏色的轉義序列格式以下:
    CSI n1 [;n2 [;…]] m
其中CSI全稱爲「控制序列引導器」(Control Sequence Introducer/Initiator),也就是上述示例中的"\033["(其中\033是你鍵盤左上角Esc鍵對應的ascii碼(八進制));n一、n2等表示SGR參數(下面會列出一些經常使用的SGR參數),用於控制顏色、粗體、斜體、閃爍等文本輸出格式;m表示轉義序列結束。
注:\033是鍵盤左上角Esc鍵對應的ASCII碼(8進制),\03三、\x1b和\e效果同樣, 例如:echo -e "\x1b[31mRed Text\e[0m"也輸出紅色字體「Red Text」。

除了shell命令可輸出顏色,其它語言中也可使用上述ANSI轉義序列輸出顏色(前提是你使用的終端仿真器可以解析ANSI轉義序列),如下給出幾種主要語言中輸出顏色文本的示例。
注:如下程序僅針對類unix終端有效,win32控制檯不支持ANSI轉義序列,於是無效。

http://www.cnblogs.com/crabxx/p/4046498.html

https://en.wikipedia.org/wiki/ANSI_escape_code

經常使用的SRG參數列表以下:

能夠選擇的編碼以下所示(這些顏色是ANSI標準顏色):
編碼 顏色/動做
0   從新設置屬性到缺省設置
1   設置粗體
2   設置一半亮度(模擬彩色顯示器的顏色)
4   設置下劃線(模擬彩色顯示器的顏色)
5   設置閃爍
7   設置反向圖象
22   設置通常密度
24   關閉下劃線
25   關閉閃爍
27   關閉反向圖象
30   設置黑色前景
31   設置紅色前景
32   設置綠色前景
33   設置黃色前景
34   設置藍色前景
35   設置紫色前景
36   設置青色前景
37   設置白色(灰色)前景
38   在缺省的前景顏色上設置下劃線
39   在缺省的前景顏色上關閉下劃線
40   設置黑色背景
41   設置紅色背景
42   設置綠色背景
43   設置黃色背景
44   設置藍色背景
45   設置紫色背景
46   設置青色背景
47   設置白色(灰色)背景
49   設置缺省黑色背景
其餘有趣的代碼還有:
\033[2J   清除屏幕
\033[0q   關閉全部的鍵盤指示燈
\033[1q   設置"滾動鎖定"指示燈(Scroll Lock)
\033[2q   設置"數值鎖定"指示燈(Num Lock)
\033[3q   設置"大寫鎖定"指示燈(Caps Lock)
\033[15:40H 把關閉移動到第15行,40列
\007    發蜂鳴生beep

\033與\e是同樣功能

\a ASCII 響鈴字符(也能夠鍵入 \007)
\e ASCII 轉義字符(也能夠鍵入 \033)

下面看幾個例子:

echo -e "\033[30m 黑色字 \033[0m"
echo -e "\033[31m 紅色字 \033[0m"
echo -e "\033[32m 綠色字 \033[0m"
echo -e "\033[33m 黃色字 \033[0m"
echo -e "\033[34m 藍色字 \033[0m"
echo -e "\033[35m 紫色字 \033[0m"
echo -e "\033[36m 天藍字 \033[0m"
echo -e "\033[37m 白色字 \033[0m"
 

echo -e "\033[40;37m 黑底白字 \033[0m"
echo -e "\033[41;37m 紅底白字 \033[0m"
echo -e "\033[42;37m 綠底白字 \033[0m"
echo -e "\033[43;37m 黃底白字 \033[0m"
echo -e "\033[44;37m 藍底白字 \033[0m"
echo -e "\033[45;37m 紫底白字 \033[0m"
echo -e "\033[46;37m 天藍底白字 \033[0m"
echo -e "\033[47;30m 白底黑字 \033[0m"

控制選項說明 :

m前面的0能夠省略。

\033[0m 關閉全部屬性
\033[1m 設置高亮度
\033[4m 下劃線
\033[5m 閃爍
\033[7m 反顯
\033[8m 消隱
\033[30m -- 37m 設置前景色
\033[40m -- 47m 設置背景色 
\033[nA 光標上移n行
\033[nB 光標下移n行
\033[nC 光標右移n行
\033[nD 光標左移n行
\033[y;xH設置光標位置
\033[2J 清屏
\033[K 清除從光標到行尾的內容
\033[s 保存光標位置
\033[u 恢復光標位置
\033[?25l 隱藏光標
\033[?25h 顯示光標

順序無關,只須要記憶數值所表明的含義便可,由於數值已經限定了是背景仍是前景之類的

文本終端的顯示顏色可使用「ANSI很是規字符序列」來生成。
例如:echo -e "\033[44;37;5m ME\033[0m COOL"
解釋:"\033[44;37;5m ME "設置背景爲藍色,前景爲白色,閃爍光標,輸出字符「ME」;
"\033[0m COOL"從新設置屏幕到缺省設置,輸出字符 「COOL」。
"e"是命令echo的一個可選項,它用於激活特殊字符的解析器。"\033"引導很是規字符序列(即"\033["表示終端轉義字符開始,"\033"即退出鍵<ESC>的ASCII碼)。"m"意味着設置屬性而後結束很是規字符序列,這個例子裏真正有效的字符是"44;37;5"和"0"。修改"44;37;5"能夠生成不一樣顏色的組合,數值和編碼的先後順序沒有關係。

echo顯示帶顏色,須要使用參數-e
格式以下:
echo -e "\033[字背景顏色;文字顏色m字符串\033[0m"
例如:
echo -e "\033[41;37m TonyZhang \033[0m"

echo -e "\e[41;37m TonyZhang \e[0m"
其中41的位置表明底色, 37的位置是表明字的顏色

 注:
一、字背景顏色和文字顏色之間是英文的「""」
二、文字顏色後面有個m
三、字符串先後能夠沒有空格,若是有的話,輸出也是一樣有空格

一些說明:
前景顏色各數字是對應背景顏色減去10。
結束很是規字符序列的"m"要緊跟前面的數字,不能有空格。
命令也能夠寫成echo -e "^[[44;37;5m ME \033[0m COOL",其中的"^["是先按Ctrl-V,而後再按<ESC>鍵產生的。
輸出帶有顏色的文本,echo命令必須帶有選項"-e"。
這種方法只能暫時改變echo命令輸出的文本的樣式,logout後就恢復爲默認。修改.bashrc文件,能夠修改默認的顯示樣式。
如:在.bashrc文件的最後面追加一行:echo -e '\033[47;30m'。

# echo命令的其餘用法
光標跳到第60列,而後顯示一個OK。
格式:echo -en '\033[60G' && echo OK
說明:"\033["是終端轉義字符開始,60G是命令。

 

添加顏色至關容易,第一步是設計不帶顏色的提示行;
添加終端(而不是 bash)可識別的專用轉義序列,以使它以彩色顯示文本的某些部分。
標準 Linux 終端和 X 終端容許您設置前景(文字)顏色和背景顏色,若是須要,還能夠啓用 "bold" 字符。
有八種顏色可供咱們選擇。前景編號 (30-37) 和背景編號 (40-47)
顏色是經過在 PS1 中添加專用序列來選擇的──基本上是夾在 "\e["(轉義開方括號)和 "m" 之間數字值。若是指定一個以上的數字代碼,則用分號將它們分開。下面是一個顏色代碼示例:"\e[0m"
若是將數字代碼指定爲零,則它就會通知終端將前景、背景和加粗設置重置爲它們的默認值。您可能會在提示行結束時使用這個代碼,以使您鍵入的文字成爲非彩色的。

我已說明了如何在提示行中添加信息和顏色,但您還能夠更進一步。您能夠經過在提示行中添加專用代碼來使 X 終端(如 rxvt 或 aterm)的標題欄獲得動態更新。您所要作的只是將下面的序列添加到您的 PS1 提示行中:
"/e]2;titlebar/a"
只須用您但願其出如今 xterm 標題欄中的文字替換子串 "titlebar" 便可,如今已經一切就緒了!沒必要使用靜態文字;您能夠將 bash 轉義序列插入標題欄中。請查看下面這個示例,它將用戶名、主機名和當前工做目錄顯示在標題欄中,並定義了一個簡短、明亮的綠色提示行:
export PS1="/[/e]2;/u@/H /w/a/e[32;1m/]>/[/e[0m/] "
由於它將所有信息顯示在標題欄上,而不是顯示在終端上,終端對一行能夠顯示多少字符有限 制。順便提一句,確保用 "/[" 和 "/]" 將您的標題欄序列括起來(由於就終端而言,這個序列是非打印序列)。將大量信息放在標題欄中的問題是,若是您使用非圖形終端(如系統控制檯),則看不到這 些信息。爲了解決這個問題,能夠在您的 .bashrc 中添加如下幾行:
if [ "$TERM" = "linux" ]
then
#we're on the system console or maybe telnetting in
export PS1="/[/e[32;1m/]/u@/H > /[/e[0m/]"
else
#we're not on the console, assume an xterm
export PS1="/[/e]2;/u@/H /w/a/e[32;1m/]>/[/e[0m/] "
fi
這個 bash 條件語句將根據當前的終端設置動態設置提示行。爲了得到一致性,您必定但願配置您的 ~/.bash_profile,以便它在啓動時搜索 (source) 您的 ~/.bashrc。確保您的 ~/.bash_profile 文件中有如下這樣一行:
source ~/.bashrc

顏色碼錶

#!/bin/bash
T='samples'
echo
echo "        default   40m       41m       42m       43m       44m       45m       46m       47m"
## FG 爲前景(foreground)色, BG 爲背景(background)色
for FGs in '    m' '   1m' '  30m' '1;30m' '  31m' '1;31m' '  32m' '1;32m' '  33m' '1;33m' '  34m' '1;34m' '  35m' '1;35m' '  36m' '1;36m' '  37m' '1;37m'
        do
        FG=$(echo $FGs|tr -d ' ')
        echo -en " $FGs \033[$FG $T "
        for BG in 40m 41m 42m 43m 44m 45m 46m 47m;
                do
                echo -en " \033[$FG\033[$BG $T \033[0m"
        done
        echo
done
echo
vi cfont
cfont() {
while (($#!=0)) do case $1 in -b) echo -ne " "; ;; -t) echo -ne "\t"; ;; -n)
              echo -ne "\n"; ;; -black) echo -ne "\033[30m"; ;; -red) echo -ne "\033[31m"; ;; -green) echo -ne "\033[32m"; ;; -yellow) echo -ne "\033[33m"; ;; -blue) echo -ne "\033[34m"; ;; -purple) echo -ne "\033[35m"; ;; -cyan) echo -ne "\033[36m"; ;; -white|-gray) echo -ne "\033[37m"; ;; -reset) echo -ne "\033[0m"; ;; -h|-help|--help) echo "Usage: cfont -color1 message1 -color2 message2 ..."; echo "eg: cfont -red [ -blue message1 message2 -red ]"; ;; *) echo -ne "$1" ;; esac shift done }source cfont  #將此函數放入當前shell環境中,而後才能執行cfont -cyan cfont -reset
相關文章
相關標籤/搜索