Bash
使用帶有反斜杠 () 的 echo -e
我正在閱讀 Unix 中的 echo 命令,我對 -e 選項和反斜杠 (
\
) 轉義字元感到困惑 我執行了以下兩個範例:echo "hello\\\\world"
輸出:
hello\\world
現在使用 -e 執行相同的命令:
echo -e "hello\\\\world"
輸出:
hello\world
-e
那麼帶和不帶選項的反斜杠字元的含義是什麼?問候
在 Bash 雙引號字元串中,您可以使用反斜杠來確保將下一個字元視為文字。也就是說,鍵入參數
"a\\b"
會導致將文字字元串a\b
傳遞給命令。由此我們可以得出結論,在這兩種情況下,您都將hello\\world
作為最後一個參數傳遞給echo
在這兩種情況下 - 每對反斜杠在傳遞給之前擴展為單個文字反斜杠echo
。
-e
標誌“echo
啟用$$ s $$以下反斜杠轉義的解釋”(詳見
help echo
)。\\
作為單個反斜杠的轉義序列在那裡列出,因此在這種情況下echo
,Bash 對原始字元串執行相同的操作並將兩個反斜杠減少為一個。-e
標誌是主要用於能夠包含轉義序列,例如\t
水平製表符或\n
換行符。例如:$ echo -e 'first\tsecond\tthird' first second third
我建議改用
printf
這個。首先,它使用格式字元串意味著我們可以安全地將使用者提供的字元串與轉義序列混合:$ printf '%s\t%s\t%s\n' 'inject\nescape' '\\' '\evil' inject\nescape \\ \evil
其次,並非所有版本的
echo
support-e
以及不小心使用未引用的變數都會讓人們改變echo
的行為:$ injection='-e a\nb' $ echo $injection a b
第三:本博士論文層次分析。
附帶說明一下,Bash 不會將單引號字元串中的反斜杠視為轉義字元,這就是我們得到以下結果的原因:
$ echo 'hello\\\\world' hello\\\\world $ echo -e 'hello\\\\world' hello\\world