Ame*_*ina 11 shell bash zsh quoting
如何处理echo
和printf
处理zsh
,bash
和其他 shell 中的反斜杠?
在zsh 下,我得到以下行为:
$ echo "foo\bar\baz"
foaaz
$ echo "foo\\bar\\baz"
foaaz
$ echo 'foo\bar\baz'
foaaz
$ echo 'foo\\bar\\baz'
foo\bar\baz
Run Code Online (Sandbox Code Playgroud)
在bash 下,事情似乎更加一致:
bash$ echo "foo\bar\baz"
foo\bar\baz
bash$ echo 'foo\bar\baz'
foo\bar\baz
bash$
Run Code Online (Sandbox Code Playgroud)
但更具体地说:如何传递包含反斜杠的字符串,例如\\foo\bar\something
:
echo
printf
print
并获得完全相同的字符串?(在zsh
和bash
)?
下面是另一个 zsh 函数的实验:
function foo
{
echo -E '$1'
}
$ foo \\here\is\some\path
$1
Run Code Online (Sandbox Code Playgroud)
我怎样才能让它打印出来\\here\is\some\path
?
我在 zsh 5.0.2 中尝试了以下内容:
function foo
{
printf '$s\n' $1
}
foo '\\some\path'
Run Code Online (Sandbox Code Playgroud)
但是这个打印$s
?
Sté*_*las 14
zsh
echo
以标准方式运行,就像bash
在 UNIX 模式下一样。也就是说,它\b
按照 UNIX 规范的要求扩展为 ASCII BS 字符。
printf '%s\n' "$1"
Run Code Online (Sandbox Code Playgroud)
print -r -- "$1"
也有效,但是是ksh
/zsh
特定的。
echo -E - "$1"
一起工作zsh
,我相信一些BSD系统。
cat << EOF
$1
EOF
Run Code Online (Sandbox Code Playgroud)
可以在任何类似 Bourne 的 shell 中工作,即使是几十年前没有printf
命令但它会产生一个新进程的shell ,现在真的没有必要,因为我们现在printf
到处都有。
顺便说一下,您需要在 shell 命令行上转义反斜杠,因为它对 shell 来说是特殊的(每个 shell but rc
),所以:
$ foo '\\foo\bar'
Run Code Online (Sandbox Code Playgroud)
foo \\foo\bar
将传递无法重新发明丢失的反斜杠的"\foo\bar"
字符串foo
。
归档时间: |
|
查看次数: |
26287 次 |
最近记录: |