Невозможно заставить искусство ASCII эхо-консоль

Я новичок в Bash сценариях, и это здесь просто озадачивает меня. Я добавляю искусство ASCII к проекту и не могу понять, как избежать определенных символов. Кто-нибудь, пожалуйста, помогите мне получить следующий код ниже, чтобы работать?

Всякий раз, когда я пытался добавить косые черты в качестве escape-символов для исправления ошибок, косые черты также завершили печать на консоль при выполнении. Это разрушает изображение. Я не понимаю, что я делаю неправильно, поэтому я разместил код ниже в надежде, что кто-то займет минуту, чтобы показать мне правильный путь. Пожалуйста? Я удалил кавычки, чтобы избежать лишних помех.

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

Ответы

Ответ 1

Цитаты в bash являются важными синтаксическими элементами, а не беспорядками. Однако, чтобы печатать ASCII-искусство, избавьте себя от необходимости правильного цитирования и экранирования и просто используйте here document:

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

Обязательно не удаляйте цитаты здесь. Они не являются обязательными.

Ответ 2

echo принимает ряд аргументов. Если вы наберете

echo  foo      bar

команда echo получает два аргумента, "foo" и "bar", а расстояние между словами отбрасывается.

Для того, что вы пытаетесь сделать, вы, вероятно, хотите, чтобы echo получал ровно один аргумент для каждой строки. В bash наиболее простым способом является использование так называемого "ANSI-C Quoting" . Внутри каждой строки каждый символ апострофа ' и обратного слэша \ должен быть экранирован с обратным слэшем.

Здесь версия вашего script с использованием этого метода:

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

(Добавленные обратные косые черты действительно испортили изображение в script, но он отображается правильно на выходе.)

В этом случае что ответ другого парня является лучшим подходом, поскольку он избегает необходимости избегать каких-либо специальных символов, но этот метод может быть полезен для меньший выход.

Или вы можете просто поместить необработанное изображение в файл и cat его на стандартный вывод.