為什麼指令 echo `echo \\\z` 輸出 \z?

為什麼指令 echo `echo \\\z` 輸出 \z?

該命令echo $(echo \\\z)來自這本書 ,我不明白為什麼它會輸出

\z

我認為它應該輸出

z

答案1

\是 shell 的引用運算子。當在其他類型的引號之外時,\x就像'x'(除非x是換行符號)。

所以:

echo \\\x

就好像:

echo '\''x'

或者

echo '\x'

Soecho使用兩個參數調用,一個包含echo(其名稱),另一個包含\x.

根據 POSIXecho,當其任何操作數(命令名稱以外的參數)包含反斜線或其第一個操作數時的行為是-n未指定的。您會發現,即使在此之外,行為也會有所不同。

根據 UNIX 規範(在上面的連結中應用 XSI), 的行為echo '\z'也未指定,因為\z它不是標準轉義序列之一。

但是,使用 UNIX 相容的echo,例如echo的內建函數bash -o posix -O xpg_echo,您可以保證:

echo '\\z'

與...一樣:

echo \\\\z

或者:

echo \\\\\z

將輸出\z<newline>.

除此之外,您不會得到 POSIX 的任何保證。

實作可以輸出zor \zor no such escape sequence: \zor NUL 字元...

然而在實踐中,我不知道有任何實作可以理解\z為轉義序列,所以我發現我嘗試的所有實作都\z<newline>在那裡輸出。

如果您想要一種便攜且可靠的方式來輸出文本,不使用echoprintf改用

答案2

將語句 echo 分成幾部分

\ 是 bash 辨識為轉義的變數

因此 \ 正在轉義字元“\”,因此列印 \

\z 轉義字元“z”,因此印出 z

綜合起來,我們有 \z

相關內容