Bash: цветной вывод с переменной

У меня есть следующая функция:

function pause #for prompted pause until ENTER
{


prompt="$3"
    echo -e -n "\E[36m$3" #color output text cyan
    echo -e -n '\E[0m' #ends colored output
    read -p "$*"  #read keys from user until ENTER.
    clear

}

pause "Press enter to continue..."

Однако моя функция отказывается применить голубой цвет к строке, которую я передаю в функцию.

Аналогичный вопрос был задан здесь, но кажется, что я делаю все правильно...

Ответ 1

Я немного изменил ваш код:

#!/bin/bash

function pause() {
    prompt="$1"
    echo -e -n "\033[1;36m$prompt"
    echo -e -n '\033[0m'
    read
    clear
}

pause "Press enter to continue..."

Что я изменил:

  • Вы инициализировали запрос $3, когда правильный аргумент был $1
  • Последовательность ANSI была неправильной. См.: http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html
  • Вызов для чтения был неправильным, вы использовали несколько аргументов для использования $*. В этом конкретном случае вы отбрасываете ввод, поэтому даже не нужно сохранять результат чтения. Я предлагаю вам прочитать man-страницу: http://linux.die.net/man/1/bash, чтобы узнать, как точно использовать чтение. Если вы передадите несколько аргументов, эти аргументы будут сопоставлены с именами переменных, которые будут содержать разные поля, введенные в строку.

Ответ 2

Попробуйте следующее:

RESTORE='\033[0m'

RED='\033[00;31m'
GREEN='\033[00;32m'
YELLOW='\033[00;33m'
BLUE='\033[00;34m'
PURPLE='\033[00;35m'
CYAN='\033[00;36m'
LIGHTGRAY='\033[00;37m'

LRED='\033[01;31m'
LGREEN='\033[01;32m'
LYELLOW='\033[01;33m'
LBLUE='\033[01;34m'
LPURPLE='\033[01;35m'
LCYAN='\033[01;36m'
WHITE='\033[01;37m'

function test_colors(){

  echo -e "${GREEN}Hello ${CYAN}THERE${RESTORE} Restored here ${LCYAN}HELLO again ${RED} Red socks aren't sexy ${BLUE} neither are blue ${RESTORE} "

}

function pause(){
  echo -en "${CYAN}"
  read -p "[Paused]  $*" FOO_discarded
  echo -en "${RESTORE}"
}


test_colors
pause "Hit any key to continue"

И еще веселее с фоном

echo -e "\033[01;41;35mTRY THIS\033[0m"
echo -e "\033[02;44;35mAND THIS\033[0m"
echo -e "\033[03;42;31mAND THIS\033[0m"
echo -e "\033[04;44;33mAND THIS\033[0m"
echo -e "\033[05;44;33mAND THIS\033[0m"

Ответ 3

Чтобы сэкономить время других:

https://gist.github.com/elucify/c7ccfee9f13b42f11f81

Нет необходимости использовать $(echo -ne) повсюду, потому что переменные, определенные в приведенной выше таблице, уже содержат управляющие символы. Ведущие/завершающие \001 & \002 сообщают bash, что управляющие символы не должны занимать пробел, иначе их использование в $PS1 приведет к путанице в readline.

RESTORE=$(echo -en '\001\033[0m\002')
RED=$(echo -en '\001\033[00;31m\002')
GREEN=$(echo -en '\001\033[00;32m\002')
YELLOW=$(echo -en '\001\033[00;33m\002')
BLUE=$(echo -en '\001\033[00;34m\002')
MAGENTA=$(echo -en '\001\033[00;35m\002')
PURPLE=$(echo -en '\001\033[00;35m\002')
CYAN=$(echo -en '\001\033[00;36m\002')
LIGHTGRAY=$(echo -en '\001\033[00;37m\002')
LRED=$(echo -en '\001\033[01;31m\002')
LGREEN=$(echo -en '\001\033[01;32m\002')
LYELLOW=$(echo -en '\001\033[01;33m\002')
LBLUE=$(echo -en '\001\033[01;34m\002')
LMAGENTA=$(echo -en '\001\033[01;35m\002')
LPURPLE=$(echo -en '\001\033[01;35m\002')
LCYAN=$(echo -en '\001\033[01;36m\002')
WHITE=$(echo -en '\001\033[01;37m\002')

# Test
echo ${RED}RED${GREEN}GREEN${YELLOW}YELLOW${BLUE}BLUE${PURPLE}PURPLE${CYAN}CYAN${WHITE}WHITE${RESTORE} 

Ответ 4

Проблема в том, что эта строка:

echo -e -n "\E[36m$3" #color output text cyan

должен быть:

echo -e -n "\E[36m" #color output text cyan

и вы должны устранить эту строку, так как вы не используете переменную:

prompt="$3"

Также конечная последовательность должна быть перемещена в приглашение read. На самом деле, последовательность начала также может быть.

Результат:

function pause #for prompted pause until ENTER
{
    read -p $'\E[36m'"$*"$'\E[0m'  #read keys from user until ENTER.
    clear
}

pause "Press enter to continue..."

Цвета могут быть помещены в переменные:

cyan=$'\E[36m'
reset=$'\E[0m'
read -p "$cyan$*$reset"

$'' вызывает интерпретацию escape-последовательности точно так же, как echo -e.

Ответ 5

Вот реализация, которая работает на терминале MacOS для установки PS1 с окраской, а что нет.

Существует две реализации, одна из которых полагается на echo, а другая - на printf для динамического вызова методов, не нарушая ад.

Это только начало, но надежное и не будет мерцать терминал. Поддерживает git branch прямо сейчас, но может быть расширен в конечном итоге.

Можно найти здесь:

https://github.com/momomo/opensource/blob/master/momomo.com.shell.style.sh

Должен работать просто скопировать и вставить. Нет зависимостей.