終于知道 Shell 中單引號雙引號的區(qū)別了
本文轉(zhuǎn)載自微信公眾號「Linux開發(fā)那些事兒」,作者LinuxThings 。轉(zhuǎn)載本文請聯(lián)系Linux開發(fā)那些事兒公眾號。
在編寫 shell 腳本或輸入命令時,你可能已經(jīng)注意到大多數(shù)命令都可以使用單引號 或雙引號, 這不僅適用于 shell 腳本,而且適用于所有 Bash 命令, 但是兩種類型的引號以及 Bash shell 解釋它的方式之間存在一定的差異,下面將介紹它們之間的不同
單引號
用單引號 ' ' 括起來的字符會保留引號內(nèi)每個字符的字面值
簡而言之,shell 將逐字解釋單引號內(nèi)的封閉文本,并且不會插入任何內(nèi)容,包括變量、反引號、某些 \ 轉(zhuǎn)義符等
單引號中的任何字符都沒有特殊含義, 當(dāng)你不想使用轉(zhuǎn)義字符來更改 shell 腳本解釋輸入字符串參數(shù)方式時,就會很方便
雙引號
雙引號類似于單引號,只是它允許 shell 解釋美元符號 ( $ )、反引號 ( ` )、反斜杠 ( \ ) 和感嘆號 ( ! ), 這些字符與雙引號一起使用時具有特殊含義,并且在顯示之前對其進(jìn)行評估
雙引號可以通過在雙引號前加上反斜杠來使用其自身
實(shí)例
下面通過幾個實(shí)例來說明 單引號 和 雙引號之間的一些區(qū)別
實(shí)例1
新建 shell 腳本 t1.sh ,內(nèi)容如下
- #!/bin/bash
- a=98
- echo "$a"
- echo '$a'
執(zhí)行 ./t1.sh 命令,結(jié)果如下
- [root@localhost quotes_test]# ./t1.sh
- 98
- $a
從結(jié)果可以看出,雙引號中的 $a 被解釋為變量 a 的值
但是單引號中的 $a 只是原樣輸出,單引號不會解釋其中的 $ 以及 a 字符
實(shí)例2
雙引號中的 \\n 會被轉(zhuǎn)義成換行符\n,但在單引號內(nèi),\n 被當(dāng)成普通字符與同一行的其他字符一起顯示
實(shí)例3
新建 shell 腳本 t2.sh, 內(nèi)容如下
- #!/bin/bash
- ary[0]=8
- echo "${ary[0]}"
- echo '${ary[0]}'
執(zhí)行腳本,結(jié)果如下
- [root@localhost quotes_test]# ./t2.sh
- 8
- ${ary[0]}
從結(jié)果可以看出,當(dāng) ${ary[0]} 用雙引號括起來時,表示數(shù)組的第一個元素,所以輸出 8
但是,被單引號括起來時,被當(dāng)做單純的字符輸出,并不會解釋為數(shù)組的第一個元素
實(shí)例4
新建 shell 腳本 t3.sh, 內(nèi)容如下
- #!/bin/bash
- a=45
- echo "'$a'"
- echo '"$a"'
執(zhí)行腳本,結(jié)果如下
- [root@localhost quotes_test]# ./t3.sh
- '45'
- "$a"
由上面的結(jié)果可知,單引號在雙引號內(nèi)沒有特殊的含義,因此,即使 $a 在單引號內(nèi),也還是會解釋成 45
但是,當(dāng)雙引號在單引號內(nèi)時,即使 $a 位于雙引號內(nèi),也不會對變量 a 求值, 還是按照普通字符輸出
實(shí)例5
新建 shell 腳本 t4.sh, 內(nèi)容如下
- #!/bin/bash
- a=" $(printf hello) " # 相當(dāng)于 " `printf hello` "
- b=' $(printf hello) ' # 相當(dāng)于 ' `printf hello` '
- echo $a
- echo $b
執(zhí)行腳本,結(jié)果如下
- [root@localhost quotes_test]# ./t4.sh
- hello
- $(printf hello)
從結(jié)果可以知道,雙引號中的 $(printf hello) 會被解釋成 printf hello 命令,執(zhí)行 echo $a 命令相當(dāng)于執(zhí)行了 printf hello , 結(jié)果輸出 hello
單引號中的 $(printf hello) ,只是表示普通字符而已,所以 echo $b 命令的結(jié)果是 $(printf hello) 字符的原樣輸出
小結(jié)
本文介紹了 shell 中單引號和雙引號的區(qū)別,主要是通過實(shí)例的方式來展示他們之間的不同點(diǎn),熟悉了它們的不同點(diǎn)后,在編寫 shell 腳本過程中,就不會在單雙引號上出錯了