Bash:带变量的彩色输出
我有以下功能:Bash:带变量的彩色输出,bash,variables,Bash,Variables,我有以下功能: 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
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..."
但是,我的函数拒绝将青色应用于传递给函数的字符串
有人问了一个类似的问题,但似乎我做的每件事都是正确的…我稍微更改了您的代码:
#!/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..."
我改变了什么:
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"
问题是这一行:
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
相同,以节省其他人的时间:
无需到处$(echo-ne)
,因为上面要点中定义的变量已经包含了控制字符。前导/尾随的\001
和\002
告诉bash控制字符不应该占用空间,否则在$PS1
中使用这些字符将混淆读线
RESTORE=$(echo -en '\001\033[0m\002')
RED=$(echo -en '\001\033[00;31m\002')
GREEN=$(echo -en '\001\033[00;32m\002')
YELLOW=$(echo -en '\001\033[00;33m\002')
BLUE=$(echo -en '\001\033[00;34m\002')
MAGENTA=$(echo -en '\001\033[00;35m\002')
PURPLE=$(echo -en '\001\033[00;35m\002')
CYAN=$(echo -en '\001\033[00;36m\002')
LIGHTGRAY=$(echo -en '\001\033[00;37m\002')
LRED=$(echo -en '\001\033[01;31m\002')
LGREEN=$(echo -en '\001\033[01;32m\002')
LYELLOW=$(echo -en '\001\033[01;33m\002')
LBLUE=$(echo -en '\001\033[01;34m\002')
LMAGENTA=$(echo -en '\001\033[01;35m\002')
LPURPLE=$(echo -en '\001\033[01;35m\002')
LCYAN=$(echo -en '\001\033[01;36m\002')
WHITE=$(echo -en '\001\033[01;37m\002')
# Test
echo ${RED}RED${GREEN}GREEN${YELLOW}YELLOW${BLUE}BLUE${PURPLE}PURPLE${CYAN}CYAN${WHITE}WHITE${RESTORE}
引用
$*
会将结果视为单个字符串。在OP的read
命令中,传递给函数的所有参数都作为提示符输出。那样做没有什么特别不好的。您的第1点基本上是正确的,但是,为了与OP似乎在做的事情保持一致,它应该是$@
,而不是$3
(或$1
)。OP的ANSI序列没有问题——它对我来说很有效。这很有效,但我也按照丹尼斯的建议将结束序列合并到了第一行。整个要点是以青色回显“按下回车键继续”,然后等待按下回车键。这似乎不管用…@derp:你说得对,转义码不会被解释。请参阅我的编辑。