Bash單引號與雙引號的區別


如果您使用過Bash,您可能已經注意到,在定義變數或向命令傳遞引數時,可以使用兩種型別的引號:單引號(' ')和雙引號(" ")。

乍一看,這些引號似乎可以互換使用,但它們之間實際上存在一些關鍵區別,這些區別會影響Bash命令的行為。在本文中,我們將探討這些差異,並解釋何時應該使用單引號,何時應該使用雙引號,以及混合使用它們時會發生什麼。

單引號和雙引號的定義

在我們深入探討單引號和雙引號之間的區別之前,讓我們定義它們是什麼以及它們是如何工作的。

單引號 - 將文字字串用單引號括起來,將導致Bash將引號內的所有內容解釋為字面字串,引號內的任何字元都沒有特殊含義。

示例

echo 'Hello World!'

輸出

Hello World!

在上面的示例中,單引號確保字串末尾的感嘆號被解釋為字面字元,而不是在Bash中可能具有其他含義的特殊字元。

雙引號 - 將文字字串用雙引號括起來,將導致Bash以特殊方式解釋引號內的某些字元。例如,Bash將用其值替換引號內的任何變數,並將解釋某些轉義序列,例如
(換行符)、\t(製表符)和\e(轉義符)。

示例

name='John'
echo "Hello $name!"

輸出

Hello John!

在上面的示例中,Bash 將 $name 變數的值(即“John”)替換到用雙引號括起來的字串中。

單引號與雙引號:區別

現在我們知道了單引號和雙引號的工作方式,讓我們來探討它們之間的區別。

變數替換

正如我們在前面的示例中看到的,Bash 會替換用雙引號括起來的變數的值,但不會替換用單引號括起來的變數的值。這意味著如果您想在字串中包含變數的值,則應將字串用雙引號括起來。

示例

name='John'
echo "Hello $name!"

echo 'Hello $name!'

輸出

Hello John!
Hello $name!

在上面的第二個示例中,變數 $name 沒有被替換,因為它被單引號括起來了。

命令替換

您還可以使用引號來括起命令,這允許您將命令的輸出替換到字串中。但是,單引號和雙引號處理命令替換的方式有所不同。

當您用雙引號括起命令時,Bash 將執行該命令並將它的輸出替換到字串中。當您用單引號括起命令時,Bash 將該命令視為字面字串,並且不會執行該命令或替換它的輸出。

例如:

$ echo "The current directory is: $(pwd)"
The current directory is: /home/user

$ echo 'The current directory is: $(pwd)'
The current directory is: $(pwd)

在上面的第一個示例中,命令 pwd 被執行,並且它的輸出被替換到用雙引號括起來的字串中。在第二個示例中,命令 pwd 被視為字面字串,因為它被單引號括起來了。

特殊字元

正如我們前面提到的,Bash 會解釋雙引號內的某些轉義序列,例如
和 \t,但在單引號內不會。這意味著如果您想在字串中包含特殊字元,則應將字串用雙引號括起來。

例如:

$ echo "This is a string
with a newline character" This is a string with a newline character

在上面的示例中,
轉義序列被解釋為換行符,因為它被雙引號括起來了。如果我們將字串用單引號括起來,Bash 將會把
解釋為字面反斜槓後跟字母 n。

引用字元

最後,值得注意的是,您可以使用引號來包含否則會被Bash解釋為特殊字元的字元。例如,如果您想在字串中包含字面 $ 或 \ 字元,您可以將字串用單引號括起來。

示例

echo '$5.00'

echo '\home\user'

輸出

$5.00
\home\user

在上面的第一個示例中,$ 字元被視為字面字元,因為字串被單引號括起來了。在第二個示例中,反斜槓也被視為字面字元,因為字串被單引號括起來了。

混合使用單引號和雙引號

有時,您可能希望在一個字串中同時包含單引號和雙引號。在這些情況下,您可以結合使用引號來達到預期的結果。

示例

echo "He said, 'Hello World!'"

echo 'The cost is $"5.00"'

輸出

He said, 'Hello World!'
The cost is $"5.00"

在上面的第一個示例中,我們使用雙引號來括起整個字串,但是我們使用單引號來括起巢狀字串“Hello World!”。在第二個示例中,我們使用單引號來括起整個字串,但是我們使用雙引號來括起巢狀字串 $"5.00"。

除了我們已經討論過的區別之外,在Bash中使用單引號和雙引號時,還需要考慮一些其他的細微差別。

首先,值得注意的是引號可以相互巢狀。例如,您可以用雙引號括起一個字串,然後用單引號括起一個巢狀字串。

示例

echo "He said, 'My name is John.'"

輸出

He said, 'My name is John.'

在這個示例中,我們使用雙引號來括起整個字串,但是我們使用單引號來括起巢狀字串“My name is John.”。

其次,務必注意Bash如何處理引號內的空白字元(例如空格和製表符)。當您用雙引號括起一個字串時,Bash 會保留引號內的任何空白字元。當您用單引號括起一個字串時,Bash 會將所有空白字元視為字面字元。

示例

name='John Smith'
echo "Hello, $name"

echo 'Hello,    $name'

輸出

Hello, John Smith
Hello,    $name

在上面的第一個示例中,Bash 保留了“John”和“Smith”之間的空格字元,因為字串是用雙引號括起來的。在第二個示例中,Bash 將製表符視為字面字元,因為字串是用單引號括起來的。

最後,值得一提的是,在Bash中並不總是需要引號。例如,如果您定義一個包含沒有特殊字元的字串的變數,您可以完全省略引號。

示例

message=Hello
echo $message

輸出

Hello

在這個示例中,我們定義變數“message”包含字串“Hello”,而沒有用引號括起來。當我們稍後回顯變數時,Bash 會毫無問題地列印字串“Hello”。

結論

總而言之,Bash中單引號和雙引號的主要區別在於,雙引號允許變數替換、命令替換和某些轉義序列的解釋,而單引號將它們內部的所有內容視為字面字串。在Bash中引用字串時,務必根據要實現的目標選擇合適的引號型別。如果您不確定使用哪種型別的引號,通常使用雙引號是安全的,因為它們允許最大的靈活性。

更新於:2023年4月12日

瀏覽量:1000+

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告