2012-05-05 4 views
11

У меня есть следующие функции: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..." 

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

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

ответ

10

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

#!/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..." 

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

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

Цитирование '$ *' приводит к тому, что результат рассматривается как одна строка. В команде 'read' OP все аргументы, переданные функции, выводились как приглашение. В этом нет ничего особенного. Однако ваша точка 1, по сути, правильна, чтобы соответствовать тому, что, по-видимому, делает OP, она должна быть '$ @' вместо '$ 3' (или' $ 1'). Нет ничего плохого в последовательности ANSI OP - это работает для меня. –

+0

Нет ничего плохого в 'read -p" something "' – dschulz

+0

Даже с 'read -p '$ *" ' – dschulz

23

Попробуйте это:

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" 
2

Проблема заключается в том, что эта линия:

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" 

$'' вызывает последовательность побега быть истолкована так же, как echo -e.

+0

Все дело в том, чтобы эхо «Нажмите enter для продолжения» в голубом, а затем дождитесь ввода ввода. Это, похоже, не работает ... – derp

+0

@derp: Вы правы, коды выхода не интерпретируются. См. Мое редактирование. –

6

спасти другое время:

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

Нет необходимость $ (эхо -ne) повсюду, поскольку переменные, определенные в сущности выше уже содержат управляющие символы.

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

# Test 
echo ${RED}RED${GREEN}GREEN${YELLOW}YELLOW${BLUE}BLUE${PURPLE}PURPLE${CYAN}CYAN${WHITE}WHITE${RESTORE} 
Смежные вопросы