2013-04-07 65 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