web-dev-qa-db-fra.com

Impossible d'obtenir ASCII art pour faire écho à la console

Je suis nouveau dans les scripts Bash, et cela me laisse perplexe. J'ajoute ASCII art à un projet, et je n'arrive pas à comprendre comment échapper à certains caractères. Quelqu'un pourrait-il m'aider à faire fonctionner le code suivant ci-dessous?

Chaque fois que j'essayais d'ajouter des barres obliques en tant que caractères d'échappement pour corriger les erreurs, les barres obliques se terminaient également par l'impression sur la console lors de l'exécution. Cela ruine l'image. Je ne comprends pas ce que je fais mal, j'ai donc posté le code ci-dessous dans l'espoir que quelqu'un prenne un moment pour me montrer le bon chemin. S'il vous plaît? J'ai supprimé les guillemets pour éviter plus d'encombrement.

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           ()`    
21
user3698316

Les citations en bash sont des éléments syntaxiques importants, pas un encombrement. Cependant, pour imprimer ASCII art, épargnez-vous la peine de citer et de vous échapper correctement et utilisez simplement un here document:

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

Assurez-vous de ne pas supprimer les citations ici. Ils ne sont pas facultatifs.

66
that other guy

echo prend une série d'arguments. Si vous tapez

echo  foo      bar

la commande echo obtient deux arguments, "foo" et "bar", et l'espacement entre les mots est supprimé.

Pour ce que vous essayez de faire, vous voulez probablement que echo reçoive exactement un argument pour chaque ligne. En bash, la façon la plus simple est probablement d'utiliser ce qu'on appelle "ANSI-C Quoting" . Dans chaque chaîne, chaque apostrophe ' et barre oblique inversée \ le caractère doit être échappé avec une barre oblique inverse.

Voici une version de votre script utilisant cette méthode:

#!/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 $'          ()`'

(Les barres obliques inversées ajoutées gâchent l'image dans le script, mais elles apparaissent correctement en sortie.)

Dans ce cas, la réponse de cet autre gars est une meilleure approche, car elle évite d'avoir à échapper l'un des caractères spéciaux, mais cette technique pourrait être utile pour une sortie plus petite.

Ou vous pouvez simplement mettre l'image brute dans un fichier et cat la sortie standard.

2
Keith Thompson