2012-05-05 20 views
11

Mam następującą funkcję:Bash: Kolorowy Wyjście z 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..." 

Jednak moja funkcja odmawia zastosowania koloru cyjan na ciąg I przejść do funkcji.

Podobny pytano here, ale wydaje się, że robię wszystko poprawnie ...

Odpowiedz

10

Mam nieco zmienił swój kod:

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

Co zmieniłem:

  1. Byłaś inicjowanie zachęty do $ 3, gdy prawidłowa argumentem było $ 1
  2. sekwencja ANSI była błędna. Zobacz: http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html
  3. Wywołanie odczytu było niepoprawne, przekazałeś kilka argumentów do użycia $ *. W tym konkretnym przypadku odrzucasz dane wejściowe, więc nie trzeba nawet zapisywać wyniku odczytu. Proponuję przeczytać stronę podręcznika: http://linux.die.net/man/1/bash, aby zobaczyć, jak dokładnie używać czytać. Jeśli przekażesz kilka argumentów, te argumenty zostaną zmapowane na nazwy zmiennych, które będą zawierać różne pola wprowadzone w linii.
+0

Cytując '$ *' powoduje, że wynik jest postrzegany jako pojedynczy ciąg. W poleceniu OP 'read' wszystkie argumenty przekazane do funkcji zostały wyprowadzone jako zachęta. Nie ma nic szczególnie złego w robieniu tego w ten sposób. Twój punkt 1 jest zasadniczo poprawny, jednak aby być zgodnym z tym, co OP robi, powinno być '$ @' zamiast '$ 3' (lub' $ 1'). Nie ma nic złego w sekwencji ANSI OP - działa to dla mnie. –

+0

Nic nie jest nie tak z 'read -p" coś "' – dschulz

+0

Nawet z 'read -p" $ * "' – dschulz

23

Spróbuj tego:

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" 

I jest więcej zabawy ze środowisk

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

Problem polega na tym, że ta linia:

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

powinno być:

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

i należy wyeliminować tę linię, ponieważ nie używasz zmiennej:

prompt="$3" 

także sekwencja końcowy powinien zostać przeniesiony do wiersza read. W rzeczywistości sekwencja początkowa też może być.

Rezultat:

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

Kolory mogą być wprowadzone do zmiennych:

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

$'' powoduje sekwencja ucieczki należy interpretować tak jak echo -e.

+0

Cały punkt to echo "Naciśnij Enter, aby kontynuować" w kolorze cyjan, a następnie zaczekaj na naciśnięcie klawisza Enter. To chyba nie działa ... – derp

+0

@derp: Masz rację, kody ucieczki nie zostaną zinterpretowane. Zobacz moją edycję. –

6

by ratować innych czas:

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

Nie trzeba $ (echo -ne) w każdym miejscu, ponieważ zmienne zdefiniowane w GIST powyżej już zawierać znaki kontrolne.

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}