我想在 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 )
> ^ <
也可以看看: