无法在控制台中输出ASCII艺术字

28

我刚开始学习Bash脚本编程,以下内容令我感到困惑。我正在将ASCII艺术添加到一个项目中,但似乎无法弄清楚如何转义某些字符。请问有人可以帮助我让下面的代码正常工作吗?

每当我尝试添加斜杠作为转义字符来修复错误时,这些斜杠也会在执行时打印到控制台上。这会破坏图像。我不明白我做错了什么,所以我已经贴出了下面的代码,希望有人可以花点时间向我展示正确的方法。为了避免混乱,我已删除了引号。

echo -en "\E[31m"
echo
echo       _,.
echo     ,` -.)
echo    '( _/'-\\-.              
echo   /,|`--._,-^|          ,    
echo   \_| |`-._/||          ,'|      
echo     |  `-, / |         /  /     
echo     |     || |        /  /      
echo      `r-._||/   __   /  / 
echo  __,-<_     )`-/  `./  /
echo '  \   `---'   \   /  /
echo     |           |./  / 
echo     /           //  /    
echo \_/' \         |/  /        
echo  |    |   _,^-'/  /             
echo  |    , ``  (\/  /_       
echo   \,.->._    \X-=/^        
echo   (  /   `-._//^` 
echo    `Y-.____(__}             
echo     |     {__)          
echo           ()`    

2
我认为你指的是反斜杠(\),而不是斜杠(/) - Keith Thompson
2个回答

91

在bash中,引号是重要的语法元素,而不是杂乱无章的东西。但是,为了打印ASCII艺术,为自己省去适当引用和转义的麻烦,只需使用here document

cat << "EOF"
       _,.
     ,` -.)
    '( _/'-\\-.               
   /,|`--._,-^|            ,     
   \_| |`-._/||          ,'|       
     |  `-, / |         /  /      
     |     || |        /  /       
      `r-._||/   __   /  /  
  __,-<_     )`-/  `./  /
 '  \   `---'   \   /  / 
     |           |./  /  
     /           //  /     
 \_/' \         |/  /         
  |    |   _,^-'/  /              
  |    , ``  (\/  /_        
   \,.->._    \X-=/^         
   (  /   `-._//^`  
    `Y-.____(__}              
     |     {__)           
           ()`     
EOF

请务必不要删除这里的引号。它们不是可选项。


2
第一个定界符(即:“EOF”)上的引号是必需的,因为它将整个内容视为文本,反斜杠、引号和反引号的特殊含义不会被考虑在内。 - ns15
2
当我在我的bash脚本中运行此命令时,出现了“意外的文件结尾”错误。通过删除EOF关闭前的所有空格来解决了这个问题。https://dev59.com/zGIj5IYBdhLWcg3wsnCn - Eric Majerus
无法工作。Bash脚本无法打开,我在Win 10上。 - Smooth Neon
@SmoothNeon 一个bash脚本打开是什么意思?你是从终端运行它的吗?怎么运行的?它显示了什么? - that other guy
我的意思是它在执行后立即关闭。根据我的观察,“EOF”使其表现出这种方式。幸运的是,我找到了一个更简单的解决方案。创建一个新的文本文件(.txt和.ASC扩展名对于ascii来说是最好的),将你的ascii艺术粘贴到文本文件中并保存,现在在批处理文件中,你必须使用“type FILE.txt”链接该文件。就这样,你的艺术作品应该出现了,而且你还节省了一些空间,因为ascii艺术作品在另一个文件中(所以它不会混乱脚本)。 - Smooth Neon
显示剩余3条评论

1

echo命令接受一系列参数。如果您键入

echo  foo      bar
echo 命令有两个参数,分别为 "foo""bar",单词之间的空格将被丢弃。
对于您想要做的事情,您可能希望每行仅向 echo 传递一个参数。在 bash 中,最简单的方法可能是使用所谓的 "ANSI-C Quoting"。在每个字符串中,每个撇号 ' 和反斜杠 \ 字符都必须用反斜杠进行转义。
以下是使用此方法的脚本版本:
#!/bin/bash

echo -n $'\E[31m'
echo $''
echo $'      _,.'
echo $'    ,` -.)'
echo $'   \'( _/\'-\\\\-.'
echo $'  /,|`--._,-^|          ,'
echo $'  \\_| |`-._/||          ,\'|'
echo $'    |  `-, / |         /  /'
echo $'    |     || |        /  /'
echo $'     `r-._||/   __   /  /'
echo $' __,-<_     )`-/  `./  /'
echo $'\'  \\   `---\'   \\   /  /'
echo $'    |           |./  /'
echo $'    /           //  /'
echo $'\\_/\' \\         |/  /'
echo $' |    |   _,^-\'/  /'
echo $' |    , ``  (\\/  /_'
echo $'  \\,.->._    \\X-=/^'
echo $'  (  /   `-._//^`'
echo $'   `Y-.____(__}'
echo $'    |     {__)'
echo $'          ()`'

对于这种情况,那个人的答案是一个更好的方法,因为它避免了需要转义任何特殊字符,但这种技术对于较小的输出可能会有用。

或者你可以将原始图片放入文件中,并将其cat到标准输出。

(添加的反斜杠确实会破坏脚本中的图片,但在输出上显示正确。)


有一个实用工具的名称可以自动“修复”这个问题吗? - mckenzm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接