終於知道 Shell 中單引號雙引號的區別了


在編寫 shell 腳本或輸入命令時,你可能已經注意到大多數命令都可以使用單引號 或雙引號, 這不僅適用於 shell 腳本,而且適用於所有 Bash 命令, 但是兩種類型的引號以及 Bash shell 解釋它的方式之間存在一定的差異,下面將介紹它們之間的不同

單引號

用單引號 ' ' 括起來的字符會保留引號內每個字符的字面值

簡而言之,shell 將逐字解釋單引號內的封閉文本,並且不會插入任何內容,包括變量、反引號、某些 \ 轉義符等

單引號中的任何字符都沒有特殊含義, 當你不想使用轉義字符來更改 shell 腳本解釋輸入字符串參數方式時,就會很方便

雙引號

雙引號類似於單引號,只是它允許 shell 解釋美元符號 ( $ )、反引號 ( ` )、反斜杠 ( \ ) 和感嘆號 ( ! ), 這些字符與雙引號一起使用時具有特殊含義,並且在顯示之前對其進行評估

雙引號可以通過在雙引號前加上反斜杠來使用其自身

實例

下面通過幾個實例來說明 單引號 和 雙引號之間的一些區別

  • 實例1

新建 shell 腳本 t1.sh ,內容如下

#!/bin/bash

a=98
echo "$a"
echo '$a'

執行 ./t1.sh 命令,結果如下

[root@localhost quotes_test]# ./t1.sh 
98
$a

從結果可以看出,雙引號中的 $a 被解釋為變量 a 的值

但是單引號中的 $a 只是原樣輸出,單引號不會解釋其中的 $ 以及 a 字符

  • 實例2

雙引號中的 \\n 會被轉義成換行符\n,但在單引號內,\n 被當成普通字符與同一行的其他字符一起顯示

  • 實例3

新建 shell 腳本 t2.sh, 內容如下

#!/bin/bash

ary[0]=8
echo "${ary[0]}"
echo '${ary[0]}'

執行腳本,結果如下

[root@localhost quotes_test]# ./t2.sh 
8
${ary[0]}

從結果可以看出,當 ${ary[0]} 用雙引號括起來時,表示數組的第一個元素,所以輸出 8

但是,被單引號括起來時,被當做單純的字符輸出,並不會解釋為數組的第一個元素

  • 實例4

新建 shell 腳本 t3.sh, 內容如下

#!/bin/bash

a=45
echo "'$a'"
echo '"$a"'

執行腳本,結果如下

[root@localhost quotes_test]# ./t3.sh 
'45'
"$a"

由上面的結果可知,單引號在雙引號內沒有特殊的含義,因此,即使 $a 在單引號內,也還是會解釋成 45

但是,當雙引號在單引號內時,即使 $a 位於雙引號內,也不會對變量 a 求值, 還是按照普通字符輸出

  • 實例5

新建 shell 腳本 t4.sh, 內容如下

#!/bin/bash

a=" $(printf hello) "  # 相當於 " `printf hello` "
b=' $(printf hello) '  # 相當於 ' `printf hello` '
echo $a
echo $b

執行腳本,結果如下

[root@localhost quotes_test]# ./t4.sh 
hello
$(printf hello)

從結果可以知道,雙引號中的 $(printf hello) 會被解釋成 printf hello 命令,執行 echo $a 命令相當於執行了 printf hello , 結果輸出 hello

單引號中的 $(printf hello) ,只是表示普通字符而已,所以 echo $b 命令的結果是 $(printf hello) 字符的原樣輸出

小結

本文介紹了 shell 中單引號和雙引號的區別,主要是通過實例的方式來展示他們之間的不同點,熟悉了它們的不同點后,在編寫 shell 腳本過程中,就不會在單雙引號上出錯了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM