为什么bash不接受我的颜色编码?

问题描述:

我有一个简单的代码设置,但出于某种原因拒不操作应该如何为什么bash不接受我的颜色编码?

#!/bin/bash 
RED='\033[0:31m' 
RESET='\033[0m' 

基本上这些都是一些简单的颜色编码

我接下来的事情是

for file in ./dir/*.c; do 
echo "File [${RED}$file${RESET}] has been launched" 

我的预期结果是

文件[myprogram.c]有b EEN推出(虽然名称将是红色)

相反,它只是拒绝编码的颜色和转储

文件[\ 033 [0:31米]已经启动

任何想法我做错了什么?

+0

使用'echo -e'而不是'echo',同样使用'\ 033 [0; 31m',而不是冒号。 – ymonad

+1

请勿使用echo打印转义序列。由于没有便携的方式来做到这一点。改用'printf'。 – andlrc

首先因为红色是'\033[31m'。你写的意思是别的,请看下面的内容。
然后,因为代码需要解释。
这是行不通的:

$ red='\033[31m' 

$ echo "${red}Hello" 

但这:

$ red='\033[31m' 

$ echo -e "${red}Hello" 

或者,您可以指定解释值的变量:

$ red="$(echo -e '\033[31m')" 
$ red="$(printf '\033[31m')" 

然后逃逸别t需要解释:

$ echo "${red}Hello" 

您写的内容(除了使用分号应该是冒号)设置了前景的“粗体”,或者用于薄/浅的0以及用于粗体/明亮的1

$ printf '\033[31mHello\033[0;31mHello\033[1;31mHello' 

此外,3x为前景4x为背景:

$ printf '\033[31;42mHello\033[0;44;31mHello\033[1;43;31mHello\033[0m' 

一个完整表可以被印有此:

$ printf "$(printf '%s' 033[{0,1}';'3{1..8}{';'4{1..8}mXXX,';'40m=OoO\\033[0m\\n} )" 

enter image description here

+1

你应该真的使用tput来获取shell的颜色代码。 – andlrc

+0

@andlrc为什么?我写的代码不在你的系统中工作吗? – sorontar

随着tput的

#!/bin/bash 
red=$(tput setaf 1) 
reset=$(tput sgr0) 
for file in ./dir/*.c; do 
echo "File [${red}$file${reset}] has been launched" 
done 

与printf的

#!/bin/bash 
RED='\033[0;31m' 
RESET='\033[0m' 
for file in ./dir/*.c; do 
printf "File [${RED}$file${RESET}] has been launched" 
done 

。在你的代码中的错字。红色代码是[031m。 ASCII码始终以转义字符开头,即八进制33:\033。因此,要开始打印红色文本,请加入两个序列:\033[031m

我觉得this的帖子非常有帮助。特别是,作者建议使用tput而不是硬编码的值,我同意他的看法。

die() { 
    local message="$1" 
    : ${message:=Aborted} 

    # See info bash BASH_SOURCE, info bash FUNCNAME, info bash BASH_LINENO 
    printf '%s at %s:%s line %d\n' \ 
     "$message" ${BASH_SOURCE[1]} ${FUNCNAME[1]} ${BASH_LINENO[0]} >&2 

    exit 1 
} 

# See man 1 tput, man 5 terminfo. 
red=$(tput setaf 1) || die 
noattr=$(tput sgr0) || die 

# If tput is unavailable (very unlikely), use the hardcoded values as follows. 
# The ANSI codes always start with the escape character (octal 33). 
#esc='\033' 
#red="${esc}[031m" 
#noattr="${esc}[0m" 

# %b causes printf to expand backslash escape sequences. See info bash printf. 
printf '%b%s%b\n%s\n' "$red" 'red text' "$noattr" 'normal text' 

注使用printf。在新软件中使用Don't use echo