有人可以解释一下Linux shell中字符转义背后的情况吗?我尝试了以下内容并进行了很多搜索,但没有成功了解正在发生的事情(以及如何发生):
root@sv01:~# echo -e "\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\\\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\\\\ Hello!"
\\\ Hello!
root@sv01:~# echo -e "\n Hello!"
Hello!
root@sv01:~# echo -e "\\n Hello!"
Hello!
root@sv01:~# echo -e "\\\n Hello!"
\n Hello!
我在那里完全迷失了,例如,为什么三个反斜杠只给出一个反斜杠?我希望:前两个将逃脱到一个,第三个将找不到任何逃逸,因此将保持斜线(第一个实验中的行),但是正在发生的事情是第三个只是消失了。
为什么我得到四个反斜杠\\\\ Hello
?我希望每对都会给一个反斜杠->两个反斜杠。
为什么在最后一种情况下我需要三个反斜杠才能逃脱\ n?逃脱的背景是怎么回事?和\\n
案例有什么不同?
我感谢对前几行所做的任何解释。
...即使您100%确信shell是bash,即使这样
—
Charles Duffy
echo -e
也不安全:echo
如果同时启用了运行时选项posix
和xpg_echo
使用等效的构建时选项进行编译,则将按照标准运行。安全的做法是printf
改用-请参阅上面链接的“应用程序使用情况”和“ RATIONALE”部分,介绍如何printf
使用代替echo
。
echo -e
行为不是标准定义的-请参阅pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html。如果输入中的任何地方都有文字反斜杠,则输出完全由实现定义,并且唯一允许的选项是-n
(这表示符合标准的实现将在其输出上echo -e
打印出来-e
)。