2012-05-05 21 views
11

tôi có chức năng sau:Bash: màu Output với một 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..." 

Tuy nhiên, chức năng của tôi từ chối áp dụng các màu xanh lá mạ vào chuỗi tôi vượt qua vào hàm.

Một câu hỏi tương tự đã được hỏi here, nhưng có vẻ như tôi đang làm tất cả mọi thứ một cách chính xác ...

Trả lời

10

Tôi đã hơi thay đổi mã của bạn:

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

Những gì tôi đã thay đổi:

  1. Bạn đã khởi tạo lời nhắc tới $ 3, khi đối số chính xác là $ 1
  2. Trình tự ANSI không chính xác. Xem: http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html
  3. Cuộc gọi để đọc không chính xác, bạn đã chuyển một số đối số về việc sử dụng $ *. Trong trường hợp cụ thể này, bạn loại bỏ đầu vào, vì vậy thậm chí không cần thiết để lưu kết quả đọc. Tôi đề nghị bạn đọc manpage: http://linux.die.net/man/1/bash để xem cách sử dụng chính xác đọc. Nếu bạn vượt qua trong một số đối số, các đối số đó sẽ được ánh xạ tới các tên biến sẽ chứa các trường khác nhau được nhập vào dòng.
+0

Trích dẫn '$ *' làm cho kết quả được xem là một chuỗi. Trong lệnh 'read' của OP, tất cả các đối số được truyền cho hàm được xuất dưới dạng dấu nhắc. Không có gì đặc biệt sai khi làm theo cách đó. Điểm 1 của bạn về cơ bản là chính xác, tuy nhiên, để phù hợp với những gì OP dường như đang làm, nó phải là '$ @' thay vì '$ 3' (hoặc' $ 1'). Không có gì sai với chuỗi ANSI của OP - nó hoạt động cho tôi. –

+0

Không có gì sai với 'read -p' cái gì đó '' – dschulz

+0

Thậm chí không với' read -p' $ * "' – dschulz

23

Hãy thử điều này:

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" 

Và có nhiều niềm vui mới với nền

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

Vấn đề là dòng này:

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

nên là:

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

và bạn nên loại bỏ dòng này vì bạn đang không sử dụng biến:

prompt="$3" 

Ngoài ra dãy cuối nên được chuyển vào read nhắc. Trong thực tế, trình tự bắt đầu có thể được, quá.

Kết quả:

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

Những màu sắc có thể được đưa vào các biến:

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

Các $'' làm cho dãy thoát được giải thích giống như echo -e.

+0

Toàn bộ điểm là để echo "Nhấn enter để tiếp tục" trong màu lục lam, và sau đó chờ cho nhập được nhấn. Điều này dường như không hoạt động ... – derp

+0

@derp: Bạn nói đúng, các mã thoát không được giải thích. Xem chỉnh sửa của tôi. –

6

Để tiết kiệm thời gian khác:

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

Không cần phải $ (echo -ne) ở khắp mọi nơi, bởi vì các biến được định nghĩa trong các ý chính trên đã bao gồm các ký tự điều khiển.

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}