根據GNU 文檔,
只有在後跟以下字元之一時,反斜線才保留其特殊意義:'$'、'`'、'"'、'\' 或換行符。在雙引號內,後跟這些字元之一的反斜杠將被刪除。
我試過
p="a\$b";echo $p # a$b
p="a\`b";echo $p # a`b
p="a\"b";echo $p # a"b
p="a\\b";echo $p # a\b
一切都好。但換行?
p="a\newlineb";echo $p # a\newlineb
文檔中的換行符號是什麼意思?
答案1
Newline是換行符號的名稱,即通常\n
在C中寫成的字元:
$ p="a\
b"; echo "$p"
ab
結果是ab
而不是\a<newline>b
因為POSIX 標準說:
未加引號的A
<backslash>
應保留後續字元的字面值,但 a 除外<newline>
。如果 a<newline>
跟在 the 後面,<backslash>
shell 會將其解釋為行繼續。在<backslash>
將<newline>
輸入拆分為標記之前應刪除and 。由於轉義符<newline>
被完全從輸入中刪除並且不被任何空格替換,因此它不能用作標記分隔符號。
但字串是用雙引號引用...好吧,這是一個特殊情況:
<backslash>
只有當被視為特殊時,僅當後跟以下字符之一時, 才應保留其作為轉義字符的特殊含義 :$
,`
,"
,\
,<newline>
。
因此,雙引號字串意味著反斜線換行符被解釋為就好像它是不是完全被引用,這意味著它充當行繼續,並且反斜線和換行符都被刪除。
請注意,這是在您分配給p
變數時發生的,而不是在您echo
分配變數時發生的。
也可以看看忘記在 bash/POSIX shell 中引用變數的安全隱患關於引用變數的必要性,始終如此。