答案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 的任何保证。
实现可以输出z
or \z
or no such escape sequence: \z
or NUL 字符...
然而在实践中,我不知道有任何实现可以理解\z
为转义序列,所以我发现我尝试的所有实现都\z<newline>
在那里输出。
如果您想要一种便携且可靠的方式来输出文本,不使用echo
,printf
改用。
答案2
将语句 echo 分成几部分
\ 是 bash 识别为转义的变量
因此 \ 正在转义字符“\”,因此打印 \
\z 转义字符“z”,因此打印 z
综合起来,我们有 \z