2013-04-07 66 views
0

我試圖在沒有在單獨行中回答的情況下詢問用戶發明的顏色。Bash:在提示中使用顏色

目前,我有這樣的:

msg() { 
    local mesg=$1; shift 
    printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" 
} 

ALL_OFF="$(tput sgr0)" 
BOLD="$(tput bold)" 
GREEN="${BOLD}$(tput setaf 2)" 

[...] 

until [[ $REPLY = [yY] ]]; do 
    msg "Done (y/n)?" && read -p "" 
done 

但是如前所述,問題是它把應對新行:

==> Done (y/n)? 
y 

所以,我怎麼能這樣做呢?

還有什麼方法可以在顏色上有響應嗎?

+0

通常你會稱之爲「提示」,而不是「問題」。你嘗試過ANSI逃脫嗎? http://stackoverflow.com/a/3586005/1180785 – Dave 2013-04-07 23:38:11

+0

@Dave,你的意思是[這](http://stackoverflow.com/a/3585889/1821548)?這不是一個C程序。 – Det 2013-04-08 00:04:55

+1

@Dave'tput'負責查找轉義序列 - 如果您的終端是ANSI,則會返回ANSI代碼;如果這些代碼是合適的,則會返回ANSI代碼;如果您的終端具有返回值,則返回值不變不支持所需的顏色/模式/ whatnot。使用它比使用ANSI編碼更好,因此完全不支持非ANSI終端。 – 2013-04-08 04:20:14

回答

3
printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" 

如果您不想要換行符,請不要在格式字符串的末尾放置\ n。

您還可以使用閱讀:

read_msg() { 
    read -p "${GREEN}==>${ALL_OFF}${BOLD} $1${ALL_OFF}" 
} 
until [[ $REPLY = [yY] ]]; do 
    read_msg "Done (y/n)?" 
done 
+0

哈哈,當然。 – Det 2013-04-07 23:52:39