为什么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米]已经启动
任何想法我做错了什么?
答
首先因为红色是'\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} )"
答
随着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
。
使用'echo -e'而不是'echo',同样使用'\ 033 [0; 31m',而不是冒号。 – ymonad
请勿使用echo打印转义序列。由于没有便携的方式来做到这一点。改用'printf'。 – andlrc