\是 shell 的引用运算符。当在其他类型的引号之外时,\x就像'x'(除非x是换行符)。
所以:
echo \\\x
Run Code Online (Sandbox Code Playgroud)
就好像:
echo '\''x'
Run Code Online (Sandbox Code Playgroud)
或者
echo '\x'
Run Code Online (Sandbox Code Playgroud)
Soecho用两个参数调用,一个包含echo(它的名称),一个包含\x.
根据 POSIX,echo当其任何操作数(命令名称以外的参数)包含反斜杠或其第一个操作数时的行为-n是未指定的。您会发现,即使在此之外,行为也会有所不同。
根据 UNIX 规范(在上面的链接中应用 XSI), 的行为echo '\z'也未指定,因为\z它不是标准转义序列之一。
使用 UNIX 兼容的echo,例如 的echo内置bash -o posix -O xpg_echo,您可以保证:
echo '\\z'
Run Code Online (Sandbox Code Playgroud)
与...一样:
echo \\\\z
Run Code Online (Sandbox Code Playgroud)
或者:
echo \\\\\z
Run Code Online (Sandbox Code Playgroud)
将输出\z<newline>.
除此之外,您不会得到 POSIX 的任何保证。
实现可以输出zor\z或no such escape sequence: \zor 一个 NUL 字符...
然而,在实践中,我不知道任何可以理解\z为转义序列的实现,所以我发现我尝试的所有实现都在\z<newline>那里输出。
如果您想要一种可移植且可靠的文本输出方式,请不要使用echo,printf而应使用。