Bash Shell 中單引號和雙引號的區(qū)別

我們在 Linux 命令中經(jīng)常會(huì)用到引號,比如處理文件名中的空格,或者處理特殊字符的時(shí)候。
本文將介紹不同類型的引號及其在 shell 腳本中的用法。
總結(jié)一下,大概有四種類型的引號:
- 單引號:'
 - 雙引號:"
 - 反斜杠:\
 - 反引號:`
 
除了反斜杠以外,其余三個(gè)都是成對出現(xiàn)。下面我們來詳細(xì)看一下。
1.單引號
shell 會(huì)忽略單引號中所有的特殊字符,其中的所有內(nèi)容都會(huì)被當(dāng)作一個(gè)元素。
我們舉個(gè)例子,假如有一個(gè)文本文件,里面記錄了一些人名,如下:
現(xiàn)在我們使用 grep 命令在其中搜索 "Waugh",會(huì)得到兩個(gè)結(jié)果:
但是如果我們更精確一點(diǎn),搜索 Steve Waugh,就會(huì)出現(xiàn)錯(cuò)誤:
為什么會(huì)這樣呢?因?yàn)榭崭裨诿钚兄杏糜诜指蠲睢⑦x項(xiàng)和參數(shù)。在上面的例子中,我們原本是要搜索 Steve Waugh,但 shell 會(huì)將 Steve 作為 grep 的第一個(gè)參數(shù),然后將 Waugh 和 cricket 作為被搜索的文件,很顯然,沒有 Waugh 這個(gè)文件,所以就報(bào)錯(cuò)了。同時(shí),輸出中顯示了文件 cricket 的結(jié)果。
如果我們使用單引號,來搜索 'Steve Waugh',它會(huì)被視為一個(gè)整體,那這樣就得到了我們期望的搜索結(jié)果:
基本上,當(dāng)shell看到第一個(gè)單引號時(shí),它會(huì)忽略任何特殊字符(空格也是一個(gè)特殊字符),直到找到另一個(gè)單引號(右引號)。
忽略所有特殊字符
如果用單引號引起來,所有特殊字符都會(huì)失去其原本的意義。下面我們舉幾個(gè)例子。
我們在shell中聲明一個(gè)變量,如果用$回顯變量名,它將顯示變量的值:
但如果用單引號引起來,$ 將失去其特殊的功能。
另一個(gè)例子,回車鍵(回車字符)也放在單引號里面:
2.雙引號
雙引號幾乎與單引號相似。這里之所以說“幾乎”是因?yàn)樗麄円矔?huì)忽略所有特殊字符,除了:
- 美元符號:$
 - 反引號:`
 - 反斜杠:\
 
由于美元符號 $ 不會(huì)被忽略,所以我們可以使用變量名,得到變量的值;但是單引號就不能這樣:
雙引號還可用于在shell中轉(zhuǎn)義單引號(即將其轉(zhuǎn)義為普通字符):
反過來用(用單引號轉(zhuǎn)義雙引號),也可以:
3.反斜杠
反斜杠用于轉(zhuǎn)義特殊字符??聪旅娴睦樱?/p>
因?yàn)?v 沒有什么特別的含義,echo \var 只是簡單的打印了 var。另一方面,當(dāng)使用 $var 的時(shí)候,反斜杠轉(zhuǎn)義了 $ 符號,所以打印出了 $var。
用反斜杠轉(zhuǎn)義換行符
我們可以使用反斜杠來轉(zhuǎn)義換行符,這樣就可以將單個(gè)命令換行繼續(xù)編寫。
當(dāng)命令太長或是多個(gè)命令的組合時(shí),你會(huì)看到一些網(wǎng)站使用反斜杠在多行中顯示單個(gè)命令。這可以使命令或代碼更具可讀性。
看下面的例子:
現(xiàn)在我們使用反斜杠,將上述命令分解為多行:
這樣看起來容易多了。
雙引號內(nèi)的反斜杠
在雙引號內(nèi),/ (反斜杠)、$ (美元符號)以及 ` (反引號)是不被轉(zhuǎn)義的三個(gè)符號。
這樣的話,我們就可以使用反斜杠來轉(zhuǎn)義雙引號中的美元符號、雙引號以及反引號了。
看下面的例子,其中的 $5 會(huì)被認(rèn)為是一個(gè)未聲明的變量,且沒有被賦值,所以在 echo 命令中會(huì)將其忽略:
要避免上述情況,可以使用 \ 來轉(zhuǎn)義 $
4.反引號
反引號( ` )有一個(gè)特殊含義,用于命令替換。
Shell 具有此命令替換功能,其中指定的命令將替換為命令的輸出。
在下面的例子中,??date?? 會(huì)被替換為 date 命令的輸出信息,即系統(tǒng)的當(dāng)前日期和時(shí)間而輸出:
需要注意的一點(diǎn)是,只有當(dāng)反引號之間是一個(gè)命令的時(shí)候,才會(huì)進(jìn)行替換,否則,將會(huì)按原內(nèi)容顯示:
如前文所述,將反引號放在雙引號中,不會(huì)被轉(zhuǎn)義,但是放在單引號中,會(huì)被轉(zhuǎn)義為普通字符。
反引號不在建議使用
很長時(shí)間以來,反引號都用于 Shell 腳本中的命令替換,但是現(xiàn)在,現(xiàn)代 Unix 和 Linux 系統(tǒng)更提倡使用 $(command) 結(jié)構(gòu),比如:
所以,反引號已經(jīng)不再使用了。
以上就是本次分享全部內(nèi)容,歡迎討論。















 
 
 



 
 
 
 