echo命令_Linux echo命令:顯示文字並給文字新增顏色

2020-07-16 10:04:30
相信絕大多數程式設計師人生中的第一個程式都是“Hello,world”,而在 Linux Shell 中,這個程式是由 echo 命令來完成的。當你需要在螢幕上顯示一些提示資訊時,你就需要 echo 的幫忙,它就像一個麥克風,說你想說,唱你想唱。

用 echo 顯示字串

其實非常的簡單,就是在 echo 後面加上想要顯示的內容就好了:
[[email protected] ~]$ echo 'Hello World'
Hello World
 
[[email protected] ~]$ echo "Hello World"
Hello World
 
[[email protected] ~]$ echo Hello World
Hello World
至於單引號、雙引號、不加引號的區別,還請看下面的內容。

用 echo 顯示變數的值

在 echo 的後面,不僅可以加字串,還可以加變數名:
#我們定義了一個變數, 叫作str
[[email protected] ~]$ str="Hello World"
 
#在echo後面加上str變數, 照樣可以顯示出來
[[email protected] ~]$ echo "$str, good morning"
Hello World, good morning

神奇的反斜槓跳脫

跳脫字元,是 Shell 中的一些具有特殊功能的字元,比如 n 表示換行、t 表示製表符等。跳脫字元統一由反斜線“”開頭,後跟一個或幾個字元,這樣就賦予了字元“神奇的能力”。

在 echo 中,要使用跳脫字元,需要使用-e選項,並使用雙引號將跳脫字元括起來。

下面來看看實際的用法吧:
#一個很普通的Hello World
[[email protected] ~]$ echo "Hello World"
Hello World
 
#尾部帶有n的Hello World, n並沒有被賦予"神奇的能力"
[[email protected] ~]$ echo "Hello Worldn"
Hello Worldn
 
#使用了-e選項後, n被賦予了"神奇的能力", 它實現了換行效果
[[email protected] ~]$ echo -e "Hello Worldn"
Hello World

從上面的例子可以得出結論:
  • 不帶-e選項的 echo,將 n 認為是普通字元;
  • 使用了-e選項的 echo,會將 n 認為是換行符。

其實世間還有很多跳脫字元,我們來一起開開眼界,如表 1 所示。
表1 跳脫字元
列印引數 解 釋
a 響鈴
b 退格(backspace)
e 跳脫符
c 不換行
f 換頁
n 換行
r 回車
t 水平製表符
v 垂直製表符
ONNN 位元組數以八進位制數 NNN (1 至 3 位)表不
xHH 位元組數以十六進位制數 HH (1 至 2 位)表不

關閉 echo 的自動換行行為

預設情況下,echo 會在內容輸出之後換行。如果平時沒有注意過的話,這裡再為大家演示一遍:
[[email protected] ~]$ echo "Hello World"
Hello World
[[email protected] ~]$

如果希望改變這種預設的換行行為,有兩種方法:
  • -n選項去掉 echo 末尾的換行符;
  • -e選項列印出跳脫字元。

在開發 Shell 程式時,我們經常需要使用者在一些提示語句後面的同一行輸入一些內容,這時,我們就需要用到“讓 echo 不換行”的技能了。

面的例子中,我們顯示“Enter your username:”的同時不進行換行,等待使用者在提示語後面輸入他們的使用者名稱,這種體驗要比換行後輸入使用者名稱更友好:
#使用-n後, echo後面的換行效果消失了, 這也就導致了Shell提示符顯示在了提示語同一行的後面
[[email protected] ~]$ echo -n "Enter your username:"
Enter your username:[[email protected] ~]$
 
#用-e選項加c跳脫符, 也可以實現不換行效果
[[email protected] ~]$ echo -e "Enter your username:c"
Enter your username:[[email protected] ~]$

echo 後面的引號

在文章開始階段,我們為大家展示了三種 Hello World,大家還記得下面這三個命令吧:
[[email protected] ~]$ echo 'Hello World'
Hello World
 
[[email protected] ~]$ echo "Hello World"
Hello World
 
[[email protected] ~]$ echo Hello World
Hello World

這三個 echo 命令的寫法不同,但卻有著相同的輸出,所以很多人就誤以為單引號、雙引號、不加引號的效果是相同的。希望看完這一段落,大家會對這些引號擁有新的認識。

表2 引號的效果
輸入命令 輸出內容 解 釋
echo '$USER * $(date)' $USER * $(date) 單引號無視所有特殊字元,所有字元在它眼裡 都是普通字元,都是芸芸眾生
echo "$USER * $(date)" root * Thu Feb 25 12:03:48 CST 2016 雙引號會無視檔案萬用字元,但“$”、“”、 會起作用,我管它們叫“美金”、“砍刀”、 “硫酸雨”
echo $USER * $(date) root book others Thu Feb 25 12:03:48 CST 2016 $USER 被翻譯了 root, * 被翻譯了 book, others
是我當前目錄下的目錄結構

我們由表 2 可以看出,單引號將所有字元都看成普通字元,雙引號會解釋$`這三種特殊字元,不加引號的話則會解釋所有特殊字元。

如果我們想用 echo 列印出雙引號,該怎麼做呢:
方法一:echo""Hello World"",最外層是雙引號,它不敢無視“砍刀”,所以能起到跳脫字元的作用,可以把後面的"列印出來。
方法二:echo‘"Hello World"’,最外層是單引號,無視所有特殊字元包括雙引號,所以雙引號被認為是普通字元。
[[email protected] ~]$ echo ""Hello World""
"Hello World"
[[email protected] ~]$ echo '"Hello World"'
"Hello World"

既然有列印雙引號的需求,也就有可能列印單引號,方法是類似的,使用雙引號套單引號就可以實現了:
[[email protected] ~]$ echo "'Hello World'"
'Hello World'

這時有些 GEEK 會發出疑問了,如果單引號中間套單引號,或者雙引號中間套雙引號,會是什麼結果呢?
[[email protected] ~]# echo ""Hello World""
Hello World
從輸出的內容可以看出,並沒有任何的雙引號被顯示出來,這是為什麼呢?

原來,在 Shell 中,一個雙引號會去尋找它右邊最靠近它的那個雙引號進行配對,形成“一對雙引號”。所以我們上面的命令事與願違了,echo 會認為我們要列印三塊內容:
  1. 一對雙引號,內容是空的
  2. Hello World
  3. 又一對雙引號,內容還是空的

在 Shell 中顯示色彩

echo 命令,中文叫作“回聲”,echo 還有另一面,那就是它色彩斑斕的一面。耳聽為虛,眼見為實,我們先來看一個範例,如圖 1 所示。

圖1