在用戶的bashrc中添加一行export來修改提示符。
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默認是換行
要使轉義符生效,需加參數-e
# echo輸出顏色文本
echo命令改變樣式,以輸出不同顏色的文本,必須有 -e 選項(開啟echo中的轉義)。
在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"\"
echo "/dev/rmt0"
/dev/rmt0
echo "\"/dev/rmt0\""
"/dev/rmt0"
菜單顯示,不必多個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語言中的相同。
關於 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碼(八進制));n1、n2等表示SGR參數(下面會列出一些常用的SGR參數),用於控制顏色、粗體、斜體、閃爍等文本輸出格式;m表示轉義序列結束。
注:\033是鍵盤左上角Esc鍵對應的ASCII碼(8進制),\033、\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的位置是代表字的顏色
注:
1、字背景顏色和文字顏色之間是英文的“""”
2、文字顏色后面有個m
3、字符串前后可以沒有空格,如果有的話,輸出也是同樣有空格
一些說明:
前景顏色各數字是對應背景顏色減去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