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..."
我改变了什么:

  • 当正确的参数为$1时,您正在将提示符初始化为$3
  • ANSI序列不正确。见:
  • 对read的调用不正确,您向$*的使用传递了多个参数do。在这种情况下,您将丢弃输入,因此甚至不必保存读取结果。我建议您阅读手册页:了解如何正确使用read。如果传入多个参数,这些参数将映射到变量名,变量名将包含行中输入的不同字段
  • 试试这个:

    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:你说得对,转义码不会被解释。请参阅我的编辑。