相信絕大多數程式設計師人生中的第一個程式都是“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 會認為我們要列印三塊內容:
-
一對雙引號,內容是空的
-
Hello World
-
又一對雙引號,內容還是空的
在 Shell 中顯示色彩
echo 命令,中文叫作“回聲”,echo 還有另一面,那就是它色彩斑斕的一面。耳聽為虛,眼見為實,我們先來看一個範例,如圖 1 所示。
圖1