20

私は次の機能を持っています:

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..."

しかし、私の関数は、関数に渡す文字列にシアン色を適用することを拒否します。

ここでも同様の質問がありましたが、私はすべてを正しく行っているようです...

4

4 に答える 4

29

これを試して:

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"
于 2012-05-05T23:58:23.953 に答える
15

コードを少し変更しました:

#!/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. 正しい引数が$1の場合、プロンプトを$3に初期化していました。
  2. ANSIシーケンスが正しくありませんでした。参照:http ://tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html
  3. readの呼び出しが正しくありませんでした。$*の使用に対していくつかの引数を渡していたのです。この特定のケースでは、入力を破棄しているため、読み取り結果を保存する必要はありません。正確にreadを使用する方法については、マンページhttp://linux.die.net/man/1/bashを読むことをお勧めします。複数の引数を渡すと、それらの引数は、行に入力されたさまざまなフィールドを含む変数名にマップされます。
于 2012-05-05T23:56:14.383 に答える
14

他の人の時間を節約するには:

https://gist.github.com/elucify/c7ccfee9f13b42f11f81

$(echo -ne)上記の要点で定義された変数にはすでに制御文字が含まれているため、あちこちに配置する必要はありません。先頭/末尾の\001\002tell bashは、制御文字がスペースを占有しないようにする必要があります。そうしないと、これらをaで使用する$PS1と混乱しreadlineます。

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} 
于 2015-01-23T17:20:10.720 に答える
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

于 2012-05-06T00:10:03.473 に答える