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

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

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

 /\_/\
( o.o )
 > ^ <

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

echo /\\_/\\\n\( o.o \)\n > ^ <
echo  \/\\_\/\\\r\n( o.o )\r\n > ^ <
echo /\\_/\\\n\( o.o \)\n \> ^ <

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

答案1

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

cat <<'END_CAT'
 /\_/\
( o.o )
 > ^ <
END_CAT

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

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

printf '%s\n' ' /\_/\
( o.o )
 > ^ <'

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

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

printf '%s\n' ' /\_/\' '( o.o )' ' > ^ <'
printf '%s\n' \
' /\_/\' \
'( o.o )' \
' > ^ <'

或者,与echo(但请参阅为什么 printf 比 echo 更好?;基本上,根据 shell 及其当前设置,某些转义序列可能存在问题,这些序列可能无法很好地处理 ASCII 绘图),

echo ' /\_/\
( o.o )
 > ^ <'

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

答案2

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

所以:

$ printf ' /\\_/\\\n( o.o )\n > ^ <\n'
 /\_/\
( o.o )
 > ^ <
$ printf "%s\n" $' /\\_/\\\n( o.o )\n > ^ <'
 /\_/\
( o.o )
 > ^ <  

也可以看看:

相关内容