Bash

跨殼處理反斜杠

  • November 24, 2017

如何處理echo和處理,和其他 shellprintf中的反斜杠?zsh``bash

zsh下,我得到以下行為:

$ echo "foo\bar\baz"
foaaz
$ echo "foo\\bar\\baz"
foaaz
$ echo 'foo\bar\baz'
foaaz
$ echo 'foo\\bar\\baz'
foo\bar\baz

bash下,事情似乎更加一致:

bash$ echo "foo\bar\baz"
foo\bar\baz
bash$ echo 'foo\bar\baz'
foo\bar\baz
bash$

但更具體地說:如何傳遞包含反斜杠的字元串,例如\\foo\bar\something

  • echo
  • printf
  • print

並得到完全相同的字元串?(在zshbash)?

這是 zsh 中的另一個函式實驗:

function foo
{
   echo -E '$1'
}

$ foo \\here\is\some\path
$1

我怎樣才能讓它列印出來\\here\is\some\path

更新(注意:這已經在斯蒂芬的評論中得到了回答)

我在 zsh 5.0.2 中嘗試了以下內容:

function foo
{
   printf '$s\n' $1 
}

foo '\\some\path'

但這列印$s

zsh echo行為標準方式,如bash在 UNIX 模式下。也就是說,它\b按照 UNIX 規範的要求擴展為 ASCII BS 字元。

不要echo用於顯示任意字元串,請使用printf

printf '%s\n' "$1"

print -r -- "$1"也可以,但是是ksh/zsh特定的。

echo -E - "$1"使用zsh並且我相信一些 BSD。

cat << EOF
$1
EOF

可以在任何類似 Bourne 的 shell 中工作,即使是幾十年前沒有printf命令但它產生一個新程序的 shell,而且現在真的沒有必要,因為我們現在printf到處都有。

順便說一句,您需要在 shell 命令行上轉義反斜杠,因為它對 shell 是特殊的(除了 之外的每個 shell rc),所以:

$ foo '\\foo\bar'

foo \\foo\bar會將無法重新發明失去的反斜杠的"\foo\bar"字元串傳遞回去。foo

引用自:https://unix.stackexchange.com/questions/70459