tunyk avatar

單引號與雙引號在Bash Shell 中區別

🕖 by tunyk

引號是shell腳本和Linux命令的一個組成部分,但它們經常會讓新使用者感到困惑。 本文將為您揭開引言的單引號和雙引號的區別神秘面紗。

你會經常在Linux命令行中使用引號。 處理檔案名中的空白嗎 ? 你使用引號。 處理特殊字元? 您再次使用引號。

引號是Linux shell中的「特殊功能」,可能會讓人感到困惑,特別是如果您不熟悉 Linux 命令和 shell 腳本。

我將解釋不同類型的引號字元及其在shell腳本中的用法。

有四種不同類型的引號字元:

  • 單引號 '
  • 雙引號"
  • 反斜杠 \
  • 反引號'

除了反沖,其餘三個字元都是成對出現的。

讓我們詳細看看它們。

1.單引號

Shell 中的單引號忽略其中的所有類型的特殊字元。 單引號之間的所有內容都被視為一個元素。

讓我們舉個例子。 這是一個示例文本檔,其中包含90年代的一些板球運動員。

1
2
3
4
5
6
[email protected]:~$ cat cricket 
Allan Donald, South Africa
Steve Waugh, Australia
Mark Waugh, Australia
Henry Olonga, Zimbabwe
Sachin Tendulkar, India

現在,您使用 grep 命令尋找姓氏 Waugh 的板球運動員。 這會給你兩個結果:

1
2
3
[email protected]:~$ grep Waugh cricket
Steve Waugh, Australia
Mark Waugh, Australia

但是,如果您只想搜索 Steve Waugh,並嘗試按原樣使用它,您將看到一個錯誤:

1
2
3
[email protected]:~$ grep Steve Waugh cricket
grep: Waugh: No such file or directory
cricket:Steve Waugh, Australia

為什麼? 因為空格用於分隔命令、選項和參數。 在上面的例子,它需要作為第一個參數到grep但和被作為在其應該預製棒搜索的檔。 由於沒有名為的檔,因此會為此引發錯誤。 同時,它還顯示了來自文件的結果。 Steve``Waugh``cricket``Waugh``cricket

這就是引用來拯救的地方。 當您將參數括在引號中時,它被解釋為單個實體。

1
2
[email protected]:~$ grep 'Steve Waugh' cricket
Steve Waugh, Australia

基本上,當shell看到第一個單引號時,它會忽略任何特殊字元(空格也是特殊字元),直到找到另一個單引號(右引號)。

忽略所有特殊字元

如果用單引弧括起來,所有特殊字元都會失去意義。 讓我們用例子來看看。

讓我們在shell中聲明一個變數。 如果用 $ 回顯變數名稱,它會顯示變數的值。

1
2
3
[email protected]:~$ var=my_variable
[email protected]:~$ echo $var
my_variable

但是如果用單引弧括起來,$ 將失去它的特殊功能。

1
2
[email protected]:~$ echo '$var'
$var

現在僅此而已。 回車鍵也保留在單引號下。

1
2
3
4
[email protected]:~$ echo 'how are
> you?'
how are
you?

2. 雙引號

雙引號的工作原理幾乎與單引號相似。 幾乎是因為他們也傾向於忽略所有特殊字元,除了:

  • 美元符號 $
  • 反引號'
  • 反斜杠 \

由於美元符號不會被忽略,您可以期望變數名被替換為它的值。 單引號不是這種情況。

1
2
3
4
5
[email protected]:~$ var=my_variable
[email protected]:~$ echo "$var"
my_variable
[email protected]:~$ echo '$var'
$var

雙引號可用於在shell中隱藏單引號。

1
2
3
4
5
[email protected]:~$ var=My 'own villa' is yellow
own villa: command not found
[email protected]:~$ var="My 'own villa' is yellow"
[email protected]:~$ echo $var
My 'own villa' is yellow

同樣,您可以使用單引號在shell中隱藏雙引號。

1
2
3
4
5
[email protected]:~$ var=he said, "Awesome!"
said,: command not found
[email protected]:~$ var='he said, "Awesome!"'
[email protected]:~$ echo $var
he said, "Awesome!"

3. 反斜杠

反斜杠就像在單個字元周圍加上單引號。 反斜杠"轉義"它之前放置的字元。

這意味著反斜杠後面的字元將失去其特殊含義(如果有)。

1
2
3
4
5
6
7
[email protected]:~$ var=variable
[email protected]:~$ echo \var
var
[email protected]:~$ echo $var
variable
[email protected]:~$ echo \$var
$var

因為沒有特殊意義,只是列印var。 另一方面,當它與一起使用時,反斜杠轉義了 的特殊含義,因此它被列印為而不是的值。 v``echo \var``$var``$``$var``var

用反斜杠繼續該行

您會注意到反斜杠字元的另一個實際用途是在多行上繼續單個命令。

當一個命令太長或者它是多個命令的組合時,你會看到一些網站使用反斜杠在多行中顯示單個命令。 這使命令/代碼更具可讀性。

以這個長命令為例。

1
docker run --name server --network net -v html:/usr/share/nginx/html -v $PWD/custom-config.conf:/etc/nginx/nginx.conf -p 80:80 --restart on-failure -d nginx:latest

由於反斜杠,相同的命令可以分解為多行。

1
2
3
4
docker run --name server --network net \
-v html:/usr/share/nginx/html \
-v $PWD/custom-config.conf:/etc/nginx/nginx.conf \
-p 80:80 --restart on-failure -d nginx:latest

這是相同的命令,只是更容易理解。

雙引號內的反斜杠

反斜杠是與美元符號和反引號一起保持其特殊含義的三個特殊字元之一。

這樣,您可以使用反斜杠來轉義美元符號、雙引號和雙引號中的反引號的特殊含義。

以下面的例子為例,其中被認為是一個未聲明的變數,因此它沒有值。 這就是它在echo命令的輸出中被忽略的原因。 $5

1
2
[email protected]:~$ echo "Meal costs $5.25"
Meal costs .25

要使用這個 $ 而不被解釋為變數的值,你必須用 / 轉義它。

1
2
[email protected]:~$ echo "Meal costs \$5.25"
Meal costs $5.25

在這裡,反斜杠 (\) 被解釋為它的超能力,這是為了逃避後續字元的特殊含義。

4. 反引號

此清單中的最後一個是反引號,它具有特殊含義。 它用於命令替換。

Shell 具有此命令替換功能,其中指定的命令被替換為命令的輸出。

在下面的示例中,"date"被顯示Linux系統當前日期和時間的date命令的輸出替換。

1
2
[email protected]:~$ echo The current date and time is `date`
The current date and time is Monday 23 August 2021 04:55:18 PM IST

要記住的一件事是,只有在反引號之間存在命令時才會進行替換。 否則,它將按原樣顯示。

1
2
[email protected]:~$ echo 'The current date and time is `late`'
The current date and time is `late`

同樣,雙引號解釋反引號,但單引號忽略其特殊含義。

不再推薦反引號

多年來,反引號被用於Shell腳本中的命令替換。 但是現在,現代 UNIX 和 Linux 系統更喜歡這種結構。 $(command)

1
2
[email protected]:~$ echo The current date and time is $(date)
The current date and time is Monday 23 August 2021 05:55:47 PM IST

與時俱進,現在停止使用反引號。

💘 相关文章

写一条评论

Based on Golang + fastHTTP + sdb | go1.16.4 Processed in 1ms