2012-05-05 75 views
11

我有以下功能:擊:彩色輸出,帶有可變

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. 讀取的調用不正確,您正在傳遞幾個參數來使用$ *。在這種特殊情況下,您將放棄輸入,因此甚至不必保存讀取結果。我建議你閱讀手冊頁:http://linux.die.net/man/1/bash,看看如何正確使用閱讀。如果您傳入多個參數,那些參數將映射到將包含行中輸入的不同字段的變量名稱。
+0

引用'$ *'會導致結果被視爲單個字符串。在OP的'read'命令中,所有傳遞給該函數的參數都作爲提示輸出。這樣做沒有什麼特別的錯誤。你的觀點1基本上是正確的,但是,爲了與OP似乎做的一致,它應該是'$ @'而不是'$ 3'(或者'$ 1')。 OP的ANSI序列沒有問題 - 它適用於我。 –

+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

整點要回顯「按回車繼續」爲青色,然後等待輸入按下。這似乎不起作用... – 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}