介紹如何在 bash 環境之下處理單引號與雙引號內的跳脫字元問題。
在 bash shell 環境之下,雙引號之內的大部分字元都會維持原始字面意義(literal value),但有三種例外狀況:變數($
)、雙引號(`
) 與跳脫字元(\
)。
在雙引號中若遇到 shell 變數會自動展開,替換成變數的內容:
# 展開 $SHELL 變數 echo "SHELL=$SHELL"
SHELL=/bin/bash
若在 bash shell 中遇到兩個反引號包起來的指令,會自動將其替換為該指令執行的結果,而這個行為在雙引號中也是維持不變:
# 替換為指令輸出 echo "PWD=`pwd`"
PWD=/home/ubuntu
亦可使用 $()
這種指令替換的語法:
# 替換為指令輸出 echo "PWD=$(pwd)"
PWD=/home/ubuntu
可以匹配任意文字的萬用字元(*
,wildcards)在雙引號中是無效的:
# 自動展開萬用字元 echo /etc/a*.conf
/etc/adduser.conf /etc/apg.conf /etc/appstream.conf
# 萬用字元在雙引號中無效 echo "/etc/a*.conf"
/etc/a*.conf
若需要在雙引號中維持 $
、`
、"
與 \
字元的字面意義,可以加上跳脫字元:
# 維持字面意義 echo "\$ \` \" \\"
$ ` " \
在 bash shell 環境之下,單引號之內的所有字元都會維持原始字面意義(literal value),並且在單引號之內的文字中不允許包含另外的單引號。
# 單引號內的字元都維持字面意義 echo '\n\t\\ $PATH `pwd` /etc/*.conf'
\n\t\\ $PATH `pwd` /etc/*.conf
如果需要在單引號之內的文字中加入實際的單引號,有幾種做法,第一種是把單引號 '
替換成 '"'"'
:
# 單引號內包含單引號 echo 'You'"'"'re welcome.'
You're welcome.
'"'"'
的意義就是把原始的字串分成兩段(最前面與最後面的單引號),然後中間再加入一個以雙引號包起來的單引號。
另外一種方式則是將中間以雙引號包起來的單引號,替換成跳脫字元的形式,這樣比較容易閱讀:
# 單引號內包含單引號 echo 'You'\''re welcome.'
You're welcome.
以下是雙引號與單引號的行為比較表。
雙引號 | 單引號 | |
---|---|---|
變數 $ |
有作用 | 無作用 |
萬用字元 * |
無作用 | 無作用 |
指令替換 ` |
有作用 | 無作用 |
$'string'
在以錢字號開頭的單引號中,若遇到跳脫字元(\
),就會依照 ANSI C 標準被替換為代表的字元:
# 套用標準 ANSI C 跳脫字元 echo $'You\'re\nwelcome.'
You're welcome.