Bash'echo -e'中的三重反斜杠表现得很奇怪

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bash'echo -e'中的三重反斜杠表现得很奇怪相关的知识,希望对你有一定的参考价值。

我有多个ANSI终端颜色的Bash变量。一个是ANSI_NOCOLOR,定义如下:

ANSI_NOCOLOR="e[0m"

当我使用它来反复使用反斜杠字符(在Bash字符串中作为\转义)时,我得到一个意外的输出。

例:

echo -e "command --with --many --options \$ANSI_NOCOLOR"
echo -e "--more --options"

这导致:

command --with --many --options e[0m
--more --options

此示例可以简化为:

$ echo -e "\e[0m"
e[0m

为什么Bash中的三重反斜杠不能像其他类C语言那样通常知道呢?

预期/类似C的行为:

转义序列是左关联的。从而,

  1. 前两个\印刷为
  2. 剩下的正在进行预测(1)找到e来创建ESC角色。

解决方法: 经过一些反斜杠刨后,我发现,那5个!!反斜杠是必需的。我仍然想读一个解释,为什么它表现得像。

$ echo -e "\\e[33mfooe[0m"
foo

控制颜色重置序列很困难,因此我的解决方法使用两个ANSI颜色转义序列,将其设置为黄色并返回默认值。

答案

发生这种情况是因为工作中有两个级别的转义:

  1. 转义双引号字符串。这个传球识别\而不是e
  2. echo -e逃脱序列。这个传球识别\e

所以:

  1. 最初的字符串是\e
  2. 双引号代替\,但单独留下没有支持的e
  3. 你现在有\e
  4. Echo取代了\
  5. 你现在有e

这是为什么当任何值可能包含反斜杠时,你应该更喜欢printf而不是echo的众多原因之一。

以上是关于Bash'echo -e'中的三重反斜杠表现得很奇怪的主要内容,如果未能解决你的问题,请参考以下文章

Bash注释

markdown Bash:终端:命令:echo

sh Bash:声明,echo:显示关联数组

sh Bash:echo:文字颜色,背景颜色

bash operator usage

Shell,Bash脚本默认参数