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