2012-05-05 13 views
11

tengo la siguiente función:Bash: Salida de color con una variable

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

Sin embargo, mi función se niega a aplicar el color cian a la cadena que pasan a la función.

Una pregunta similar se le pidió here, pero parece que estoy haciendo todo correctamente ...

Respuesta

10

he ligeramente cambiado el código:

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

Lo que yo he cambiado:

  1. Usted se inicializando pronta a $ 3, cuando el argumento correcto era $ 1
  2. la secuencia ANSI era incorrecta. Ver: http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html
  3. La llamada para leer era incorrecta, usted estaba pasando varios argumentos al uso de $ *. En este caso particular, está descartando la entrada, por lo que ni siquiera es necesario guardar el resultado de la lectura. Le sugiero que lea la página de manual: http://linux.die.net/man/1/bash para ver cómo usar exactamente la lectura. Si pasa varios argumentos, esos argumentos se correlacionarán con nombres de variables que contendrán los diferentes campos ingresados ​​en la línea.
+0

Citando '$ *' hace que el resultado se vea como una sola cadena. En el comando 'read' del OP, todos los argumentos pasados ​​a la función se imprimieron como el aviso. No hay nada en particular equivocado al hacerlo de esa manera. Su punto 1 es esencialmente correcto, sin embargo, para ser coherente con lo que el OP parece estar haciendo, debería ser '$ @' en lugar de '$ 3' (o' $ 1'). No hay nada de malo en la secuencia ANSI del OP, me funciona. –

+0

No hay nada de malo en 'leer -p" algo "' – dschulz

+0

Ni siquiera con 'read -p" $ * "' – dschulz

23

Prueba esto:

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" 

Y hay más diversión con fondos

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

El problema es que esta línea:

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

debe ser:

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

y se debe eliminar esta línea, ya que no está utilizando la variable:

prompt="$3" 

también la secuencia final se debe mover en el símbolo read. De hecho, la secuencia de inicio también puede ser.

El resultado:

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

Los colores podrían ponerse en variables:

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

El $'' hace que la secuencia de escape a ser interpretado como echo -e.

+0

Todo el punto es repetir "Presionar enter para continuar" en cyan, y luego esperar a que se presione enter. Esto no parece funcionar ... – derp

+0

@derp: Tiene razón, los códigos de escape no se interpretan. Ver mi edición –

6

tiempo para salvar a otros:

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

No hay necesidad de $ (echo -ne) por todo el lugar, debido a que las variables definidas en lo esencial por encima ya contienen los caracteres de control.

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}