在符合 POSIX 的主流 shell 中轉義雙引號內的特殊字元的行為是否與 POSIX 不一致?
\
僅當被認為是特殊
<backslash>
的以下字元之一時,才應保留其作為轉義字元的特殊含義(請參閱轉義字元(反斜杠)):
$
```"
\
<newline>
我將此解釋為意味著
\
如果這五個特殊字元中的一個在其給定上下文中是特殊的,則應該只轉義它。ash、dash、bash 和 ksh 的手冊頁不包含“當被視為特殊時”的子句。我認為這意味著(並已通過基本實驗證實)
\
具有無條件轉義這五個字元的效果,即使這五個字元之一在其給定上下文中並不特殊。考慮 的輸出
$ printf '%s\n' "\abcde"
,即\abcde
。這是意料之中的,因為a
在這種情況下(或與此相關的任何情況下)並不特殊;因此 the\
並不特殊,而是按字面意思對待。現在考慮 的輸出
$ printf '%s\n' "\\abcde"
,即\abcde
。這不是我所期望的行為。在我看來,字元串中的第一個反斜杠\\abcde
也應該按字面意思對待,因為在不特殊\
的上下文中後面跟著它。\
我期望的輸出是\\abcde
.我看到意外行為的另一種情況是在 的輸出中
$ printf '%s\n' "ab\$"
,即ab$
. 在我看來,$
在這種情況下確實具有特殊含義,因為它確實用於引入參數擴展、命令替換或算術擴展。因此,在我看來,\
應該按字面意思對待,因為它在不特殊$
的上下文中緊隨其後。$
我期望的輸出是ab\$
.為了記錄,我希望我完全不在這兒。這讓我的生活變得更加困難,不得不擔心只有在某些情況下才能逃脫這五個角色。
\
我努力盡可能地正確,如果主流 POSIX 兼容 shell 中的這種(個人希望的)行為不符合 POSIX ,我不想依賴於無條件地轉義這五個特殊字元。
本註釋建議在考慮特殊時刪除文本。
該說明還報告說,該變更已於 2012 年 8 月 30 日獲得批准。
我無法說明為什麼現在的措辭中仍然使用它。
我相信你可以忘記那些話。
echo "\abc\$\\"
(例如)涉及兩個步驟。首先,由於字元串參數
echo
是雙引號,shell 將對其中的轉義字元進行處理。在它的情況下,
"\abc\$\\"
它會在將其轉換為\abc$\
之前將其交給echo
. 將\a
保持不變,因為a
它不是“特殊”字元之一。其他轉義字元將是literal,這意味著它們在 shell 中不再具有特殊含義($
不開始擴展,反斜杠不轉義下一個字元等)請注意,$
雙精度末尾的 a帶引號的字元串仍然是“特殊的”,因為它可能引入了擴展,如果字元串沒有在它之後結束。這兩個字元串"a$"
和"a\$"
是相同的,因為$
第一個字元串中的 沒有應用於任何東西。然後,
echo
可以對該字元串參數進行自己的解釋。例如,某些實現echo
會認為\a
是“鈴鐺字元”的意思。我也認為你在這裡誤讀了標準。反斜杠後跟特殊字元之一的評估將刪除反斜杠。您似乎認為它應該保持不變並且 eg
\$
應該保留為\$
. 標准說的恰恰相反。