如何输出包含斜杠和其他特殊字符的多行字符串?

Jam*_*des 23 bash shell-script echo escape-characters here-document

我想在 bash 脚本完成后输出它。

 /\_/\
( o.o )
 > ^ <
Run Code Online (Sandbox Code Playgroud)

我已尝试以下但所有返回错误。

echo /\\_/\\\n\( o.o \)\n > ^ <
echo  \/\\_\/\\\r\n( o.o )\r\n > ^ <
echo /\\_/\\\n\( o.o \)\n \> ^ <
Run Code Online (Sandbox Code Playgroud)

如何转义这些字符以便 bash 将它们呈现为字符串?

Kus*_*nda 41

在这种情况下,我将使用cat(引用的)此处文档:

cat <<'END_CAT'
 /\_/\
( o.o )
 > ^ <
END_CAT
Run Code Online (Sandbox Code Playgroud)

这是确保 ASCII 艺术按照预期方式输出的最佳方法,而不会受到 shell“妨碍”(扩展变量等、解释反斜杠转义序列或进行重定向、管道等)。

您还可以使用多行字符串printf

printf '%s\n' ' /\_/\
( o.o )
 > ^ <'
Run Code Online (Sandbox Code Playgroud)

请注意我们要输出的静态字符串周围使用单引号。我们使用单引号来确保 ASCII 字符不会被 shell 以任何方式解释。另请注意,我们输出的字符串是的第二个参数printf。第一个参数printf始终是单引号格式化字符串,其中反斜杠远非不活动。

或者多个字符串printf(每行一个):

printf '%s\n' ' /\_/\' '( o.o )' ' > ^ <'
Run Code Online (Sandbox Code Playgroud)
printf '%s\n' \
' /\_/\' \
'( o.o )' \
' > ^ <'
Run Code Online (Sandbox Code Playgroud)

或者,使用echo(但请参阅Why is printf better than echo?;基本上,根据 shell 及其当前设置,某些转义序列可能存在问题,可能无法很好地处理 ASCII 绘图),

echo ' /\_/\
( o.o )
 > ^ <'
Run Code Online (Sandbox Code Playgroud)

但同样,我认为从此处文档输出它cat是最方便和直接的。

  • 喜欢养猫的建议:D (14认同)
  • 或者 `cat &lt;&lt; ''` 或 `cat &lt;&lt; ''` :-) (7认同)

ilk*_*chu 16

用单''引号或双引号引起来"",以防止<>()被视为运算符。然后,如果您希望它在一行上,请在 Bash 中使用echo -e$' ',将换行符标记为\n并用另一个反斜杠转义反斜杠。或者更确切地说,用于printf避免不同环境之间的差异问题echo

所以:

$ printf ' /\\_/\\\n( o.o )\n > ^ <\n'
 /\_/\
( o.o )
 > ^ <
$ printf "%s\n" $' /\\_/\\\n( o.o )\n > ^ <'
 /\_/\
( o.o )
 > ^ <  
Run Code Online (Sandbox Code Playgroud)

也可以看看: