如何在 Linux 中更改 echo 的输出颜色

How to change the output color of echo in Linux

提问人:satheesh.droid 提问时间:5/10/2011 最后编辑:whackamadoodle3000satheesh.droid 更新时间:4/13/2023 访问量:1883730

问:

我正在尝试使用 echo 命令在终端中打印文本。

我想以红色打印文本。我该怎么做?

Linux Bash 命令行 echo 终端颜色 C C++ D Perl Python HTML

评论

62赞 Pithikos 10/22/2014
这个链接很有帮助:misc.flogisoft.com/bash/tip_colors_and_formatting
1赞 Konchog 9/14/2022
echo -e “普通 \e[0;31mRED 消息 \e[0m 重置”

答:

196赞 neocanable 5/10/2011 #1
echo -e "\033[31m Hello World"

控制文本颜色:[31m

  • 30-37设置前景色
  • 40-47设置背景颜色

可以在此处找到更完整的颜色代码列表。

最好将文本颜色重置回字符串末尾。\033[0m

评论

4赞 neocanable 5/10/2011
echo -e “\033[31m Hello World”,[31m 是颜色
0赞 TheGaldozer 7/15/2022
谢谢你放了一些我可以复制粘贴的东西
0赞 We'll See 3/13/2023
我喜欢你的回答,因为它简明扼要:)
237赞 Ignacio Vazquez-Abrams 5/10/2011 #2

与 的功能和参数一起使用 。tputsetaf1

echo "$(tput setaf 1)Hello, world$(tput sgr0)"

评论

13赞 Tian Chen 3/6/2013
这应该是最好的选择。tput 的作用是读取终端信息并为您呈现正确转义的 ANSI 代码。像这样的代码会破坏某些终端中的 readline 库。\033[31m
53赞 msanford 1/22/2014
通过一个简单的循环探索颜色(增加 的上限以获得更多阴影):ifor (( i = 0; i < 17; i++ )); do echo "$(tput setaf $i)This is ($i) $(tput sgr0)"; done
4赞 maxywb 8/5/2014
以下是关于输入代码的 HOWTO: tldp.org/HOWTO/Bash-Prompt-HOWTO/x405.html
0赞 el-teedee 10/5/2020
同意@TianChen,当用于输出文本的程序与此类命令不兼容时,代码也会产生一些不相关的字符。另一方面,命令不会,使输出完全可读。参见 @BenHarold 的评论,说:“对我不起作用 -- 输出:\033[31mtput + setaf\e[0;31mHello Stackoverflow\e[0m"
0赞 sherrellbc 7/14/2022
嗯,有什么区别?这两个选项生成相同的初始变色命令,但在重置的尾随命令上有所不同。直接转义序列在给定键入的内容的情况下生成您期望的二进制输出。替代方案实际上会产生一个略有不同(且更长)的 .比较此处发布的内容与例如. 实际上生成两个尾随转义序列。为什么当涉及到诸如readline之类的问题时,这比第一个选项更受欢迎?\ESC[mtput\ESC(B\ESC[m\033[31mHello, world\033[msgr0
3605赞 Tobias 5/10/2011 #3

您可以使用以下 ANSI 转义码

Black        0;30     Dark Gray     1;30
Red          0;31     Light Red     1;31
Green        0;32     Light Green   1;32
Brown/Orange 0;33     Yellow        1;33
Blue         0;34     Light Blue    1;34
Purple       0;35     Light Purple  1;35
Cyan         0;36     Light Cyan    1;36
Light Gray   0;37     White         1;37

然后在脚本中像这样使用它们:

#    .---------- constant part!
#    vvvv vvvv-- the code from above
RED='\033[0;31m'
NC='\033[0m' # No Color
printf "I ${RED}love${NC} Stack Overflow\n"

以红色打印。love

根据 @james-lim 的评论,如果您使用的是 echo 命令,请务必使用 -e 标志来允许反斜杠转义

#    .---------- constant part!
#    vvvv vvvv-- the code from above
RED='\033[0;31m'
NC='\033[0m' # No Color
echo -e "I ${RED}love${NC} Stack Overflow"

注意:使用时不要添加,除非您想添加额外的空行。"\n"echo

评论

28赞 Ben Harold 5/10/2013
对我不起作用 -- 输出:\e[0;31mHello Stackoverflow\e[0m
227赞 James Lim 5/14/2013
你试过用“-e”吗?它告诉启用反斜杠转义。echo
174赞 Xiao 6/19/2013
在 MacOSX 中,使用 instead instead 代替 . 适用于所有平台。\x1B\e\033
6赞 shonky linux user 10/1/2013
在 ant 属性文件中,使用 unicode 作为 esacpe,例如 red=\u001b[0;31 分钟
41赞 everyman 1/29/2016
就像 msanford 为 tput 制作一样,这里是“ANSI-Rainbow”for (( i = 30; i < 38; i++ )); do echo -e "\033[0;"$i"m Normal: (0;$i); \033[1;"$i"m Light: (1;$i)"; done
1315赞 Drew Noakes 1/8/2014 #4

您可以使用很棒的命令(在 Ignacio 的回答中建议)为各种事物生成终端控制代码。tput


用法

具体的子命令将在后面讨论。tput

直接

作为一系列命令的一部分调用:tput

tput setaf 1; echo "this is red text"

如果文本仍显示错误,则使用而不是 so。;&&tput

Shell 变量

另一种选择是使用 shell 变量:

red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0`
echo "${red}red text ${green}green text${reset}"

tput生成被终端解释为具有特殊含义的字符序列。他们不会被展示出来。请注意,它们仍然可以保存到文件中或由终端以外的程序作为输入进行处理。

命令替换

使用命令替换将 的输出直接插入到字符串中可能更方便:tputecho

echo "$(tput setaf 1)Red text $(tput setab 7)and white background$(tput sgr 0)"

上面的命令在 Ubuntu 上生成以下命令:

Screenshot of colour terminal text


前景色和背景色命令

tput setab [1-7] # Set the background colour using ANSI escape
tput setaf [1-7] # Set the foreground colour using ANSI escape

颜色如下:

Num  Colour    #define         R G B

0    black     COLOR_BLACK     0,0,0
1    red       COLOR_RED       1,0,0
2    green     COLOR_GREEN     0,1,0
3    yellow    COLOR_YELLOW    1,1,0
4    blue      COLOR_BLUE      0,0,1
5    magenta   COLOR_MAGENTA   1,0,1
6    cyan      COLOR_CYAN      0,1,1
7    white     COLOR_WHITE     1,1,1

还有非 ANSI 版本的颜色设置函数(而不是 ,而不是 ),它们使用不同的数字,这里没有给出。setbsetabsetfsetaf

文本模式命令

tput bold    # Select bold mode
tput dim     # Select dim (half-bright) mode
tput smul    # Enable underline mode
tput rmul    # Disable underline mode
tput rev     # Turn on reverse video mode
tput smso    # Enter standout (bold) mode
tput rmso    # Exit standout mode

光标移动命令

tput cup Y X # Move cursor to screen postion X,Y (top left is 0,0)
tput cuf N   # Move N characters forward (right)
tput cub N   # Move N characters back (left)
tput cuu N   # Move N lines up
tput ll      # Move to last line, first column (if no cup)
tput sc      # Save the cursor position
tput rc      # Restore the cursor position
tput lines   # Output the number of lines of the terminal
tput cols    # Output the number of columns of the terminal

清除和插入命令

tput ech N   # Erase N characters
tput clear   # Clear screen and move the cursor to 0,0
tput el 1    # Clear to beginning of line
tput el      # Clear to end of line
tput ed      # Clear to end of screen
tput ich N   # Insert N characters (moves rest of line forward!)
tput il N    # Insert N lines

其他命令

tput sgr0    # Reset text format to the terminal's default
tput bel     # Play a bell

对于 compiz 摇摆不定的窗口,该命令使终端摇晃一秒钟以吸引用户的注意力。bel


脚本

tput接受每行包含一个命令的脚本,这些脚本在退出之前按顺序执行。tput

通过回显多行字符串并通过管道传输来避免临时文件:

echo -e "setf 7\nsetb 1" | tput -S  # set fg white and bg red

另请参阅

  • 男人 1 tput
  • 请参阅 man 5 terminfo 以获取命令的完整列表以及有关这些选项的更多详细信息。(相应的命令列在从第 81 行开始的巨大表的列中。tputCap-name

评论

25赞 Chris Middleton 7/25/2014
很好的答案。这是对我帮助最大的一个。对于想知道我想知道什么的其他任何人,这是一个命令替换。所有要做的就是生成颜色代码字符串,但这些代码不是可打印的字符,因此仅键入将产生一行空白输出。$()tput af 1tput af 1
6赞 Enrico 12/13/2014
注意:如果您使用的是 CygWin 并且没有 tput 安装ncurses
5赞 nickboldt 2/6/2015
tput 还可以在 SED 中工作,用于将 cruft 解析为清晰、彩色的 cruft:gist.github.com/nickboldt/fab71da10bd5169ffdfa
4赞 Andrew 1/22/2017
有关颜色的完整列表,请在 Unix StackExchange 上查看此答案tput
2赞 user1169420 8/18/2022
很好的答案,但值得强调的是,将 tput 输出存储在 shell 变量中,就像你展示的那样,比你紧随其后的内联 tput 要好得多。每次对 tput 的插值调用都会生成一个过程,对于任何严重使用颜色来突出显示多行等,每行多次调用 tput 都会造成严重的可见速度减慢。更不用说内联 tput 的可读性要低得多。
33赞 Alireza Mirian 4/11/2014 #5

仅为一个更改颜色的巧妙方法是定义以下函数:echo

function coloredEcho(){
    local exp=$1;
    local color=$2;
    if ! [[ $color =~ '^[0-9]$' ]] ; then
       case $(echo $color | tr '[:upper:]' '[:lower:]') in
        black) color=0 ;;
        red) color=1 ;;
        green) color=2 ;;
        yellow) color=3 ;;
        blue) color=4 ;;
        magenta) color=5 ;;
        cyan) color=6 ;;
        white|*) color=7 ;; # white or invalid color
       esac
    fi
    tput setaf $color;
    echo $exp;
    tput sgr0;
}

用法:

coloredEcho "This text is green" green

或者你可以直接使用德鲁回答中提到的颜色代码:

coloredEcho "This text is green" 2

评论

0赞 sobi3ch 1/13/2017
如果添加到回声,则可以将其用作内联着色-necho "Red `coloredEcho "fox" red` jumps over the lazy dog"
-5赞 Dale Corns 6/26/2014 #6
red='\e[0;31m'
NC='\e[0m' # No Color
echo -e "${red}Hello Stackoverflow${NC}"

这个答案是正确的,除了对颜色的调用不应该在引号内。

echo -e ${red}"Hello Stackoverflow"${NC}

应该可以解决问题。

评论

3赞 naab 7/8/2014
在引号内工作正常。-e 开关也计算引号中的内容。使用 bash -x 同时运行(内引号和外引号)输出相同的执行命令。所以 bash 也是如此。echo -e '\e[0;31mHello Stackoverflow\e[0m'
12赞 Ooker 7/5/2014 #7

为了提高可读性

如果要提高代码的可读性,可以先使用字符串,然后再使用以下方法添加颜色:echosed

echo 'Hello World!' | sed $'s/World/\e[1m&\e[0m/' 

评论

1赞 Patrick 3/4/2016
我真的很喜欢这个答案!不过,您能解释一下 sed 命令中的 $ 吗?
2赞 dsz 10/10/2016
$'<something>' 用于 bash,而不是 sed。它告诉 bash 将 \e 作为转义序列进行处理,并在其中放置一个“转义”字符。通常,您会看到更简单的形式,如 $'\t' 或 $'\n' 来获取传递给命令的制表符或换行符。
15赞 Eric Leschinski 9/6/2014 #8

这些代码适用于我的 Ubuntu 盒子:

enter image description here

echo -e "\x1B[31m foobar \x1B[0m"
echo -e "\x1B[32m foobar \x1B[0m"
echo -e "\x1B[96m foobar \x1B[0m"
echo -e "\x1B[01;96m foobar \x1B[0m"
echo -e "\x1B[01;95m foobar \x1B[0m"
echo -e "\x1B[01;94m foobar \x1B[0m"
echo -e "\x1B[01;93m foobar \x1B[0m"
echo -e "\x1B[01;91m foobar \x1B[0m"
echo -e "\x1B[01;90m foobar \x1B[0m"
echo -e "\x1B[01;89m foobar \x1B[0m"
echo -e "\x1B[01;36m foobar \x1B[0m"

这将以不同的颜色打印字母 a b c d:

echo -e "\x1B[0;93m a \x1B[0m b \x1B[0;92m c \x1B[0;93m d \x1B[0;94m"

for 循环:

for (( i = 0; i < 17; i++ )); 
do echo "$(tput setaf $i)This is ($i) $(tput sgr0)"; 
done

enter image description here

评论

2赞 urzeit 1/16/2015
顺便说一句:这并不完全取决于是否安装了特定版本的 ubuntu,而是使用 PuTTY!
43赞 George 2/25/2015 #9

这是颜色开关。查看历史记录\033[

颜色代码如(浅绿色)、(蓝色)、(浅蓝色)等。1;320;341;34

我们用颜色开关和 ,无颜色代码终止颜色序列。就像在标记语言中打开和关闭选项卡一样。\033[0m

  SWITCH="\033["
  NORMAL="${SWITCH}0m"
  YELLOW="${SWITCH}1;33m"
  echo "${YELLOW}hello, yellow${NORMAL}"

简单的色彩功能解决方案:echo

cecho() {
  local code="\033["
  case "$1" in
    black  | bk) color="${code}0;30m";;
    red    |  r) color="${code}1;31m";;
    green  |  g) color="${code}1;32m";;
    yellow |  y) color="${code}1;33m";;
    blue   |  b) color="${code}1;34m";;
    purple |  p) color="${code}1;35m";;
    cyan   |  c) color="${code}1;36m";;
    gray   | gr) color="${code}0;37m";;
    *) local text="$1"
  esac
  [ -z "$text" ] && local text="$color$2${code}0m"
  echo "$text"
}

cecho "Normal"
cecho y "Yellow!"

评论

2赞 Shairon Toledo 10/1/2015
我会以这种方式更改最后一个变量,除了颜色参数之外,整行都将着色。texttext="$color${@: 2}${code}0m"
1赞 Artem Medvedev 3/21/2017
@tomazahlin只需将 -e 添加到回声中,如上所述
1赞 Greg Dubicki 6/8/2020
正如 Wilfred Hughes 所建议的那样,最好使用它,因为它更便携 - 也可以在 macOS 上的 Bash 中使用。因此,我实际上建议从这个答案中使用 Alireza Mirian 的函数:stackoverflow.com/a/23006365/2693875tput
1663赞 Shakiba Moshiri 3/9/2015 #10

您可以使用的一些变量:

# Reset
Color_Off='\033[0m'       # Text Reset

# Regular Colors
Black='\033[0;30m'        # Black
Red='\033[0;31m'          # Red
Green='\033[0;32m'        # Green
Yellow='\033[0;33m'       # Yellow
Blue='\033[0;34m'         # Blue
Purple='\033[0;35m'       # Purple
Cyan='\033[0;36m'         # Cyan
White='\033[0;37m'        # White

# Bold
BBlack='\033[1;30m'       # Black
BRed='\033[1;31m'         # Red
BGreen='\033[1;32m'       # Green
BYellow='\033[1;33m'      # Yellow
BBlue='\033[1;34m'        # Blue
BPurple='\033[1;35m'      # Purple
BCyan='\033[1;36m'        # Cyan
BWhite='\033[1;37m'       # White

# Underline
UBlack='\033[4;30m'       # Black
URed='\033[4;31m'         # Red
UGreen='\033[4;32m'       # Green
UYellow='\033[4;33m'      # Yellow
UBlue='\033[4;34m'        # Blue
UPurple='\033[4;35m'      # Purple
UCyan='\033[4;36m'        # Cyan
UWhite='\033[4;37m'       # White

# Background
On_Black='\033[40m'       # Black
On_Red='\033[41m'         # Red
On_Green='\033[42m'       # Green
On_Yellow='\033[43m'      # Yellow
On_Blue='\033[44m'        # Blue
On_Purple='\033[45m'      # Purple
On_Cyan='\033[46m'        # Cyan
On_White='\033[47m'       # White

# High Intensity
IBlack='\033[0;90m'       # Black
IRed='\033[0;91m'         # Red
IGreen='\033[0;92m'       # Green
IYellow='\033[0;93m'      # Yellow
IBlue='\033[0;94m'        # Blue
IPurple='\033[0;95m'      # Purple
ICyan='\033[0;96m'        # Cyan
IWhite='\033[0;97m'       # White

# Bold High Intensity
BIBlack='\033[1;90m'      # Black
BIRed='\033[1;91m'        # Red
BIGreen='\033[1;92m'      # Green
BIYellow='\033[1;93m'     # Yellow
BIBlue='\033[1;94m'       # Blue
BIPurple='\033[1;95m'     # Purple
BICyan='\033[1;96m'       # Cyan
BIWhite='\033[1;97m'      # White

# High Intensity backgrounds
On_IBlack='\033[0;100m'   # Black
On_IRed='\033[0;101m'     # Red
On_IGreen='\033[0;102m'   # Green
On_IYellow='\033[0;103m'  # Yellow
On_IBlue='\033[0;104m'    # Blue
On_IPurple='\033[0;105m'  # Purple
On_ICyan='\033[0;106m'    # Cyan
On_IWhite='\033[0;107m'   # White

BashHexOctal 中的转义字符分别为:

|       | bash  | hex     | octal   | NOTE                         |
|-------+-------+---------+---------+------------------------------|
| start | \e    | \x1b    | \033    |                              |
| start | \E    | \x1B    | -       | x cannot be capital          |
| end   | \e[0m | \x1b[0m | \033[0m |                              |
| end   | \e[m  | \x1b[m  | \033[m  | 0 is appended if you omit it |
|       |       |         |         |                              |

简短的例子:

| color       | bash         | hex            | octal          | NOTE                                  |
|-------------+--------------+----------------+----------------+---------------------------------------|
| start green | \e[32m<text> | \x1b[32m<text> | \033[32m<text> | m is NOT optional                     |
| reset       | <text>\e[0m  | <text>\1xb[0m  | <text>\033[om  | o is optional (do it as best practice |
|             |              |                |                |                                       |

bash 异常:

如果您打算在特殊的 bash 变量中使用这些代码

  • PS0的
  • QSP系列
  • PS2 (= 这是为了提示)
  • PS4的

您应该添加额外的转义字符,以便 可以正确解释它们。如果不添加额外的转义字符,它就可以工作,但是当您在历史记录中用于搜索时,您会遇到问题。Ctrl + r

bash 的异常规则

您应该在任何起始 ANSI 代码之前添加,并在任何结束代码之后添加。
示例:常规使用:适用于 PS0/1/2/4:

\[\]\033[32mThis is in green\033[0m\[\033[32m\]This is in green\[\033[m\]

\[is for a sequence of non-printable characters is for end of a sequence of non-printable characters is for end of a sequence of non-printable characters
\]

提示:为了记住它,您可以先添加,然后将ANSI代码放在它们之间:\[\]

  • \[start-ANSI-code\]
  • \[end-ANSI-code\]

颜色序列类型:

  1. 3/4 位
  2. 8 位
  3. 24 位

在深入研究这些颜色之前,您应该了解以下代码的 4 种模式:

1.颜色模式

它修改颜色的样式,而不是文本。例如,使颜色更亮或更暗。

  • 0重置
  • 1;比平时轻
  • 2;比平时更暗

此模式不受广泛支持。它完全支持 Gnome-Terminal。

2. 文本模式

此模式用于修改文本的样式,而不是颜色。

  • 3;斜体的
  • 4;下划线
  • 5;闪烁(慢速)
  • 6;闪烁(快速)
  • 7;反向
  • 8;隐藏
  • 9;划线

并且几乎得到支持。
例如,KDE-Konsole 支持但 Gnome-Terminal 不支持,Gnome 支持但 KDE 不支持。
5;8;

3.前景模式

此模式用于为前景着色。

4.背景模式

此模式用于为背景着色。

下表显示了 ANSI 颜色的 3/4 位版本的摘要

|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
| color-mode | octal    | hex     | bash  | description      | example (= in octal)         | NOTE                                 |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|          0 | \033[0m  | \x1b[0m | \e[0m | reset any affect | echo -e "\033[0m"            | 0m equals to m                       |
|          1 | \033[1m  |         |       | light (= bright) | echo -e "\033[1m####\033[m"  | -                                    |
|          2 | \033[2m  |         |       | dark (= fade)    | echo -e "\033[2m####\033[m"  | -                                    |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|  text-mode | ~        |         |       | ~                | ~                            | ~                                    |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|          3 | \033[3m  |         |       | italic           | echo -e "\033[3m####\033[m"  |                                      |
|          4 | \033[4m  |         |       | underline        | echo -e "\033[4m####\033[m"  |                                      |
|          5 | \033[5m  |         |       | blink (slow)     | echo -e "\033[3m####\033[m"  |                                      |
|          6 | \033[6m  |         |       | blink (fast)     | ?                            | not wildly support                   |
|          7 | \003[7m  |         |       | reverse          | echo -e "\033[7m####\033[m"  | it affects the background/foreground |
|          8 | \033[8m  |         |       | hide             | echo -e "\033[8m####\033[m"  | it affects the background/foreground |
|          9 | \033[9m  |         |       | cross            | echo -e "\033[9m####\033[m"  |                                      |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
| foreground | ~        |         |       | ~                | ~                            | ~                                    |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|         30 | \033[30m |         |       | black            | echo -e "\033[30m####\033[m" |                                      |
|         31 | \033[31m |         |       | red              | echo -e "\033[31m####\033[m" |                                      |
|         32 | \033[32m |         |       | green            | echo -e "\033[32m####\033[m" |                                      |
|         33 | \033[33m |         |       | yellow           | echo -e "\033[33m####\033[m" |                                      |
|         34 | \033[34m |         |       | blue             | echo -e "\033[34m####\033[m" |                                      |
|         35 | \033[35m |         |       | purple           | echo -e "\033[35m####\033[m" | real name: magenta = reddish-purple  |
|         36 | \033[36m |         |       | cyan             | echo -e "\033[36m####\033[m" |                                      |
|         37 | \033[37m |         |       | white            | echo -e "\033[37m####\033[m" |                                      |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|         38 | 8/24     |                    This is for special use of 8-bit or 24-bit                                            |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
| background | ~        |         |       | ~                | ~                            | ~                                    |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|         40 | \033[40m |         |       | black            | echo -e "\033[40m####\033[m" |                                      |
|         41 | \033[41m |         |       | red              | echo -e "\033[41m####\033[m" |                                      |
|         42 | \033[42m |         |       | green            | echo -e "\033[42m####\033[m" |                                      |
|         43 | \033[43m |         |       | yellow           | echo -e "\033[43m####\033[m" |                                      |
|         44 | \033[44m |         |       | blue             | echo -e "\033[44m####\033[m" |                                      |
|         45 | \033[45m |         |       | purple           | echo -e "\033[45m####\033[m" | real name: magenta = reddish-purple  |
|         46 | \033[46m |         |       | cyan             | echo -e "\033[46m####\033[m" |                                      |
|         47 | \033[47m |         |       | white            | echo -e "\033[47m####\033[m" |                                      |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|         48 | 8/24     |                    This is for special use of 8-bit or 24-bit                                            |                                                                                       |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|

下表显示了 ANSI 颜色的 8 位版本的摘要

|------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|
| foreground | octal     | hex       | bash    | description      | example                            | NOTE                    |
|------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|
|        0-7 | \033[38;5 | \x1b[38;5 | \e[38;5 | standard. normal | echo -e '\033[38;5;1m####\033[m'   |                         |
|       8-15 |           |           |         | standard. light  | echo -e '\033[38;5;9m####\033[m'   |                         |
|     16-231 |           |           |         | more resolution  | echo -e '\033[38;5;45m####\033[m'  | has no specific pattern |
|    232-255 |           |           |         |                  | echo -e '\033[38;5;242m####\033[m' | from black to white     |
|------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|
| foreground | octal     | hex       | bash    | description      | example                            | NOTE                    |
|------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|
|        0-7 |           |           |         | standard. normal | echo -e '\033[48;5;1m####\033[m'   |                         |
|       8-15 |           |           |         | standard. light  | echo -e '\033[48;5;9m####\033[m'   |                         |
|     16-231 |           |           |         | more resolution  | echo -e '\033[48;5;45m####\033[m'  |                         |
|    232-255 |           |           |         |                  | echo -e '\033[48;5;242m####\033[m' | from black to white     |
|------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|

8 位快速测试:
for code in {0..255}; do echo -e "\e[38;05;${code}m $code: Test"; done

下表显示了 ANSI 颜色的 24 位版本的摘要

|------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|
| foreground | octal     | hex       | bash    | description | example                                  | NOTE            |
|------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|
|      0-255 | \033[38;2 | \x1b[38;2 | \e[38;2 | R = red     | echo -e '\033[38;2;255;0;02m####\033[m'  | R=255, G=0, B=0 |
|      0-255 | \033[38;2 | \x1b[38;2 | \e[38;2 | G = green   | echo -e '\033[38;2;;0;255;02m####\033[m' | R=0, G=255, B=0 |
|      0-255 | \033[38;2 | \x1b[38;2 | \e[38;2 | B = blue    | echo -e '\033[38;2;0;0;2552m####\033[m'  | R=0, G=0, B=255 |
|------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|
| background | octal     | hex       | bash    | description | example                                  | NOTE            |
|------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|
|      0-255 | \033[48;2 | \x1b[48;2 | \e[48;2 | R = red     | echo -e '\033[48;2;255;0;02m####\033[m'  | R=255, G=0, B=0 |
|      0-255 | \033[48;2 | \x1b[48;2 | \e[48;2 | G = green   | echo -e '\033[48;2;;0;255;02m####\033[m' | R=0, G=255, B=0 |
|      0-255 | \033[48;2 | \x1b[48;2 | \e[48;2 | B = blue    | echo -e '\033[48;2;0;0;2552m####\033[m'  | R=0, G=0, B=255 |
|------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|

一些屏幕截图

前台 8 位摘要.gif

foreground.gif

背景 8 位摘要.gif

background.gif

颜色摘要及其值

enter image description here enter image description here enter image description here enter image description here

blinking在 KDE 终端上

KDE-blinking

一个简单的“C”代码,可以显示更多信息

cecho_screenshot

我开发的一个更高级的工具来处理这些颜色:

bline


彩色模式拍摄

fade-normal-bright

文本模式拍摄

only-text-mode

组合是可以的

combine

更多镜头


高级用户和程序员的提示和技巧:

我们可以在编程语言中使用这些代码吗?

是的, 你可以的。我在 方面经验丰富

它们会减慢程序的速度吗?

我想,不。

我们可以在 Windows 上使用这些吗?

3/4 位 是的,如果您在 Win-7 上使用
一些屏幕截图编译代码
gcc

如何计算代码的长度?

\033[= 2,其他部分 1

我们可以在哪里使用这些代码?

任何有解释器
、、、等的地方。
例如,如果您想使用 mysql 为输出着色,您可以使用
ttyxtermgnome-terminalkde-terminalmysql-client-CLIPerl

#!/usr/bin/perl -n
print "\033[1m\033[31m$1\033[36m$2\033[32m$3\033[33m$4\033[m" while /([|+-]+)|([0-9]+)|([a-zA-Z_]+)|([^\w])/g;

将此代码存储在文件名中:(= Perl Colorize Character),然后将文件设置为有效,然后在您喜欢的任何地方使用它。pccPATH

ls | pcc
df | pcc

在里面,首先注册它,然后尝试:mysqlpager

[user2:db2] pager pcc
PAGER set to 'pcc'
[user2:db2] select * from table-name;

pcc

处理 Unicode。

这些代码只做着色吗?

不,他们可以做很多有趣的事情。尝试:

echo -e '\033[2K'  # clear the screen and do not move the position

艺术

echo -e '\033[2J\033[u' # clear the screen and reset the position

有很多初学者想要清除屏幕,因此您可以使用它而不是呼叫system( "clear" )system(3)

它们在 Unicode 中可用吗?

是的。\u001b

这些颜色哪个版本更可取?

它易于使用,但使用起来非常准确和美观。
如果您没有 经验,那么这里有一个快速教程:24 位表示:
和 和 .每个 8 位用于特定颜色。
is for 和 for and for
所以在html中意味着,这里是:在中意味着 这里是:

这有意义吗?您想要的颜色 将其与这三个 8 位值组合在一起。
3/4-bit24-bit0000000000000000000000001..89..1617..24#FF0000255;0;0#00FF000;255;0


参考资料:
维基百科
ANSI转义序列
tldp.org
tldp.org
misc.flogisoft.com
一些我不记得的博客/网页

评论

3赞 Shakiba Moshiri 10/3/2019
@NeilGuyLindberg没有八进制文字,这个错误是 Node 的一部分.js而不是 eslist 本身。你可以用它来消除它。x1B[
1赞 Joter 4/23/2020
@ShakibaMoshiri 在仔细阅读 ANSI 转义序列之前,从答案中不清楚如何组合颜色。请注意:将输出粗体(;1)白色彩色文字(;97) 在蓝色背景 (;44),并重置所有文本属性 (0)。此外,它还取决于终端的颜色模式。echo -e "\033[97;44;1m text \033[m"\033[0m
0赞 midnite 12/2/2023
在这个简短的八进制列示例中,为什么是 it 而不是 字母 o 而不是数字 0?<text>\033[om<text>\033[0m
0赞 Shakiba Moshiri 12/5/2023
@midnite这是一个错别字,您可以更新/编辑答案
6赞 Mahn 9/24/2015 #11

为了扩展这个答案,对于我们这些懒惰的人来说:

function echocolor() { # $1 = string
    COLOR='\033[1;33m'
    NC='\033[0m'
    printf "${COLOR}$1${NC}\n"
}

echo "This won't be colored"
echocolor "This will be colorful"

评论

3赞 Toby Speight 9/24/2015
不要对终端转义进行硬编码。用;这就是它的用途!tput
0赞 WinEunuuchs2Unix 11/3/2019
@TobySpeight 虽然对于多平台支持来说可能是正确的(理论上),但如果发帖人发现它在他们自己的世界中有效,为什么不同意并劝阻类似世界的其他人使用该技术呢?举个例子,我正在 Ubuntu 16.04 bash 中尝试类似的方法,它有效。作为这个平台上的唯一用户,我觉得这个答案是可以接受的。我还将使用 for 和 though(保存光标,恢复光标)。虽然这个答案称我为“懒惰”,但它可以改写为“实用”或“直截了当”。tputscrc
10赞 nachoparker 1/24/2017 #12

到目前为止,我最喜欢的答案是coloredEcho。

只是为了发布另一个选项,您可以查看这个小工具 xcol

https://ownyourbits.com/2017/01/23/colorize-your-stdout-with-xcol/

您可以像 grep 一样使用它,例如,它会为每个参数使用不同的颜色来着色其 stdin

sudo netstat -putan | xcol httpd sshd dnsmasq pulseaudio conky tor Telegram firefox "[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+" ":[[:digit:]]+" "tcp." "udp." LISTEN ESTABLISHED TIME_WAIT

xcol example

请注意,它接受 sed 将接受的任何正则表达式。

此工具使用以下定义

#normal=$(tput sgr0)                      # normal text
normal=$'\e[0m'                           # (works better sometimes)
bold=$(tput bold)                         # make colors bold/bright
red="$bold$(tput setaf 1)"                # bright red text
green=$(tput setaf 2)                     # dim green text
fawn=$(tput setaf 3); beige="$fawn"       # dark yellow text
yellow="$bold$fawn"                       # bright yellow text
darkblue=$(tput setaf 4)                  # dim blue text
blue="$bold$darkblue"                     # bright blue text
purple=$(tput setaf 5); magenta="$purple" # magenta text
pink="$bold$purple"                       # bright magenta text
darkcyan=$(tput setaf 6)                  # dim cyan text
cyan="$bold$darkcyan"                     # bright cyan text
gray=$(tput setaf 7)                      # dim white text
darkgray="$bold"$(tput setaf 0)           # bold black = dark gray text
white="$bold$gray"                        # bright white text

我在我的脚本中使用这些变量,如下所示

echo "${red}hello ${yellow}this is ${green}coloured${normal}"
5赞 isntn 2/4/2017 #13

这是我过去看到的所有组合,并决定哪个读起来很酷:

for (( i = 0; i < 8; i++ )); do
    for (( j = 0; j < 8; j++ )); do
        printf "$(tput setab $i)$(tput setaf $j)(b=$i, f=$j)$(tput sgr0)\n"
    done
done
2赞 throws_exceptions_at_you 2/19/2017 #14

我写了物来实现这一目标。

你可以做

pip install swag

现在,您可以通过以下方式将所有转义命令作为 txt 文件安装到给定的目标:

swag install -d <colorsdir>

或者通过以下方式更轻松:

swag install

这会将颜色安装到 .~/.colors

要么你像这样使用它们:

echo $(cat ~/.colors/blue.txt) This will be blue

或者这种方式,我觉得实际上更有趣:

swag print -c red -t underline "I will turn red and be underlined"

asciinema上查看!

37赞 Wilfred Hughes 4/4/2017 #15

用于计算颜色代码。避免使用 ANSI 转义码(例如 对于红色),因为它的便携性较差。例如,OS X 上的 Bash 不支持它。tput\E[31;1m

BLACK=`tput setaf 0`
RED=`tput setaf 1`
GREEN=`tput setaf 2`
YELLOW=`tput setaf 3`
BLUE=`tput setaf 4`
MAGENTA=`tput setaf 5`
CYAN=`tput setaf 6`
WHITE=`tput setaf 7`

BOLD=`tput bold`
RESET=`tput sgr0`

echo -e "hello ${RED}some red text${RESET} world"
20赞 code-8 4/28/2017 #16

感谢 @k-five 的回答

declare -A colors
#curl www.bunlongheng.com/code/colors.png

# Reset
colors[Color_Off]='\033[0m'       # Text Reset

# Regular Colors
colors[Black]='\033[0;30m'        # Black
colors[Red]='\033[0;31m'          # Red
colors[Green]='\033[0;32m'        # Green
colors[Yellow]='\033[0;33m'       # Yellow
colors[Blue]='\033[0;34m'         # Blue
colors[Purple]='\033[0;35m'       # Purple
colors[Cyan]='\033[0;36m'         # Cyan
colors[White]='\033[0;37m'        # White

# Bold
colors[BBlack]='\033[1;30m'       # Black
colors[BRed]='\033[1;31m'         # Red
colors[BGreen]='\033[1;32m'       # Green
colors[BYellow]='\033[1;33m'      # Yellow
colors[BBlue]='\033[1;34m'        # Blue
colors[BPurple]='\033[1;35m'      # Purple
colors[BCyan]='\033[1;36m'        # Cyan
colors[BWhite]='\033[1;37m'       # White

# Underline
colors[UBlack]='\033[4;30m'       # Black
colors[URed]='\033[4;31m'         # Red
colors[UGreen]='\033[4;32m'       # Green
colors[UYellow]='\033[4;33m'      # Yellow
colors[UBlue]='\033[4;34m'        # Blue
colors[UPurple]='\033[4;35m'      # Purple
colors[UCyan]='\033[4;36m'        # Cyan
colors[UWhite]='\033[4;37m'       # White

# Background
colors[On_Black]='\033[40m'       # Black
colors[On_Red]='\033[41m'         # Red
colors[On_Green]='\033[42m'       # Green
colors[On_Yellow]='\033[43m'      # Yellow
colors[On_Blue]='\033[44m'        # Blue
colors[On_Purple]='\033[45m'      # Purple
colors[On_Cyan]='\033[46m'        # Cyan
colors[On_White]='\033[47m'       # White

# High Intensity
colors[IBlack]='\033[0;90m'       # Black
colors[IRed]='\033[0;91m'         # Red
colors[IGreen]='\033[0;92m'       # Green
colors[IYellow]='\033[0;93m'      # Yellow
colors[IBlue]='\033[0;94m'        # Blue
colors[IPurple]='\033[0;95m'      # Purple
colors[ICyan]='\033[0;96m'        # Cyan
colors[IWhite]='\033[0;97m'       # White

# Bold High Intensity
colors[BIBlack]='\033[1;90m'      # Black
colors[BIRed]='\033[1;91m'        # Red
colors[BIGreen]='\033[1;92m'      # Green
colors[BIYellow]='\033[1;93m'     # Yellow
colors[BIBlue]='\033[1;94m'       # Blue
colors[BIPurple]='\033[1;95m'     # Purple
colors[BICyan]='\033[1;96m'       # Cyan
colors[BIWhite]='\033[1;97m'      # White

# High Intensity backgrounds
colors[On_IBlack]='\033[0;100m'   # Black
colors[On_IRed]='\033[0;101m'     # Red
colors[On_IGreen]='\033[0;102m'   # Green
colors[On_IYellow]='\033[0;103m'  # Yellow
colors[On_IBlue]='\033[0;104m'    # Blue
colors[On_IPurple]='\033[0;105m'  # Purple
colors[On_ICyan]='\033[0;106m'    # Cyan
colors[On_IWhite]='\033[0;107m'   # White


color=${colors[$input_color]}
white=${colors[White]}
# echo $white



for i in "${!colors[@]}"
do
  echo -e "$i = ${colors[$i]}I love you$white"
done

结果

enter image description here

希望这张图片能帮助你为你的 bash :D选择颜色

评论

0赞 Synox 6/4/2020
需要注意的是,这需要 bash v4。
23赞 Ahmed Masud 9/21/2017 #17

这个问题已经一遍又一遍地回答了:-)但为什么不呢。

首先,在现代环境中使用比手动注入 ASCII 代码更便携tputecho -E

下面是一个快速的 bash 函数:

 say() {
     echo "$@" | sed \
             -e "s/\(\(@\(red\|green\|yellow\|blue\|magenta\|cyan\|white\|reset\|b\|u\)\)\+\)[[]\{2\}\(.*\)[]]\{2\}/\1\4@reset/g" \
             -e "s/@red/$(tput setaf 1)/g" \
             -e "s/@green/$(tput setaf 2)/g" \
             -e "s/@yellow/$(tput setaf 3)/g" \
             -e "s/@blue/$(tput setaf 4)/g" \
             -e "s/@magenta/$(tput setaf 5)/g" \
             -e "s/@cyan/$(tput setaf 6)/g" \
             -e "s/@white/$(tput setaf 7)/g" \
             -e "s/@reset/$(tput sgr0)/g" \
             -e "s/@b/$(tput bold)/g" \
             -e "s/@u/$(tput sgr 0 1)/g"
  }

现在,您可以使用:

 say @b@green[[Success]] 

要获得:

Bold-Green Success

关于可移植性的注意事项tput

1986 年 9 月首次上传源代码tput(1)

tput(1)在 1990 年代的 X/Open curses 语义中可用(1997 年标准具有下面提到的语义)。

所以,它(相当)无处不在。

评论

0赞 Redsandro 10/5/2017
这很酷!不知道这个。你能说说一下可用性吗?它是否在大多数没有管理员权限安装它的服务器上可用?你有这种技术最初被“发明”的地方的链接吗?tput
3赞 Ahmed Masud 10/6/2017
TPUT 是实现此目的的符合标准的方法,它完全独立于您了解终端功能。如果终端不支持给定的功能,它将优雅地降级到它能做的任何事情,而不会推出错误的逃逸代码。
1赞 Redsandro 10/22/2017
我已经停止使用这种方法,因为它会扰乱 bash 行中的光标位置。它将在行尾之前随机换行,并且在使用 home 或箭头键时不会一直返回到行的开头。回到笨拙的手动转义码可以解决这个问题。
2赞 Toby Speight 3/8/2018
@Resandro - 那是因为你在没有非间距部分的情况下使用它吗?继续将 Bash PS1 标记与 tput 字符串一起使用。$PS1\[...\]
1赞 NVRM 9/5/2020
我们可以使用类似的 ansi 转义序列设置光标位置、行和列。
21赞 NVRM 1/21/2018 #18

我们可以将 24 位 RGB 真彩色用于文本和背景!

 ESC[38;2;⟨r⟩;⟨g⟩;⟨b⟩m  /*Foreground color*/
 ESC[48;2;⟨r⟩;⟨g⟩;⟨b⟩m  /*Background color*/

红色文本和结束标记示例:

 echo -e "\e[38;2;255;0;0mHello world\e[0m"

发电机:

text.addEventListener("input",update)
back.addEventListener("input",update)

function update(){
  let a = text.value.substr(1).match(/.{1,2}/g)
  let b = back.value.substr(1).match(/.{1,2}/g)
  out1.textContent = "echo -e \"\\" + `033[38;2;${parseInt(a[0],16)};${parseInt(a[1],16)};${parseInt(a[2],16)}mHello\"`
  out2.textContent = "echo -e \"\\" + `033[48;2;${parseInt(b[0],16)};${parseInt(b[1],16)};${parseInt(b[2],16)}mWorld!\"`
}
div {padding:1rem;font-size:larger}
TEXT COLOR: <input type="color" id="text" value="#23233">
<br><div id="out1"></div>
BACK COLOR: <input type="color" id="back" value="#FFFF00">
<br><div id="out2">

24 位:作为具有 16 到 24 位颜色的“真彩色”显卡 变得普遍,Xterm,KDE 的 Konsole 以及所有 libvte 基于终端(包括 GNOME 终端)支持 24 位 前景色和背景色设置 https://en.wikipedia.org/wiki/ANSI_escape_code#24-bit

在我的脚本中使用安全吗?

是的!8 位和 16 位终端将只显示可用调色板范围内的一种颜色作为后备颜色,保持最佳对比度,没有破损!


此外,没有人注意到 ANSI 代码 7 反转视频的有用性。

通过交换前景色和背景色,它可以在任何终端方案颜色、黑色或白色背景或其他奇特的调色板上保持可读性。

例如,对于适用于任何地方的红色背景:

echo -e "\033[31;7mHello world\e[0m";

这是更改终端内置方案时的样子:

enter image description here

这是用于 gif 的循环脚本。

for i in {30..49};do echo -e "\033[$i;7mReversed color code $i\e[0m Hello world!";done

https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_(Select_Graphic_Rendition)_parameters

评论

0赞 admin 9/11/2021
适合 ZSHfor i in {30..49};do echo -e "\033[$i;7mReversed color code $i\e[0m Hello world\!";done
6赞 ArtBIT 4/23/2018 #19

您绝对应该使用tput而不是原始ANSI控制序列。

因为有大量不同的终端控制 语言,通常一个系统有一个中间通信层。 在数据库中查找当前检测到的真实代码 终端类型,并且您向 API 或(从 shell) 添加到命令中。

其中一个命令是 。 接受一组首字母缩略词,称为 功能名称和任何参数(如果适用),然后查找 在 terminfo 中检测到的终端的正确转义序列 数据库并打印正确的代码(希望终端 理解)。tputtput

http://wiki.bash-hackers.org/scripting/terminalcodes 相比

也就是说,我写了一个名为 bash-tint 的小型辅助库,它在 tput 之上添加了另一层,使其使用起来更加简单(恕我直言):

例: tint "white(Cyan(T)Magenta(I)Yellow(N)Black(T)) is bold(really) easy to use."

将给出以下结果:enter image description here

-2赞 Fil 6/13/2018 #20

这是最简单易读的解决方案。 使用 bashj (https://sourceforge.net/projects/bashj/),您只需选择以下行之一:

#!/usr/bin/bash

W="Hello world!"
echo $W

R=130
G=60
B=190

echo u.colored($R,$G,$B,$W)

echo u.colored(255,127,0,$W)
echo u.red($W)
echo u.bold($W)
echo u.italic($W)

Y=u.yellow($W)
echo $Y
echo u.bold($Y)

256x256x256如果您的终端应用程序中有颜色支持,则颜色可用。

111赞 ndrwnaguib 11/25/2018 #21

我刚刚合并了所有解决方案中的好渔获物,最终得到:

cecho(){
    RED="\033[0;31m"
    GREEN="\033[0;32m"  # <-- [0 means not bold
    YELLOW="\033[1;33m" # <-- [1 means bold
    CYAN="\033[1;36m"
    # ... Add more colors if you like

    NC="\033[0m" # No Color

    # printf "${(P)1}${2} ${NC}\n" # <-- zsh
    printf "${!1}${2} ${NC}\n" # <-- bash
}

你可以把它叫做:

cecho "RED" "Helloworld"

enter image description here

评论

2赞 ionescu77 3/21/2019
非常实用,我只需要用双引号替换 GREEN、YELLOW、NC 的单引号即可使其在我的脚本中工作。
2赞 Farzan 11/27/2021
我在显示文件内容时遇到了一些问题。替换为我解决了这个问题。printfecho
1赞 Adrian Lopez 12/27/2021
在 zsh 中我得到:糟糕的替换
1赞 ndrwnaguib 1/21/2022
@AdrianLopez感谢您注意到这一点!ZSH 中的间接变量引用使用 for bash 代替 for bash。我已经编辑了答案并包含了两者。${(P)1}${!1}
1赞 Nishant 7/27/2022
谢谢。很高兴了解间接变量引用:如上所述!否则,它的所有标准 bash 函数的东西。${!1}
10赞 Amirouche Zeggagh 8/19/2019 #22

要以不同的颜色显示消息输出,您可以:

echo -e "\033[31;1mYour Message\033[0m"

-黑色 0;30 深灰色 1;30

-红色 0;31 浅红 1;31

-绿色 0;32 浅绿色 1;32

-棕色/橙色 0;33 黄色 1;33

-蓝色 0;34 浅蓝色 1;34

-紫色 0;35 浅紫色 1;35

-青色 0;36 浅青色 1;36

-浅灰色 0;37 白色 1;37

21赞 Vishal 9/29/2019 #23

如果您正在使用 或zshbash

black() {
    echo -e "\e[30m${1}\e[0m"
}

red() {
    echo -e "\e[31m${1}\e[0m"
}

green() {
    echo -e "\e[32m${1}\e[0m"
}

yellow() {
    echo -e "\e[33m${1}\e[0m"
}

blue() {
    echo -e "\e[34m${1}\e[0m"
}

magenta() {
    echo -e "\e[35m${1}\e[0m"
}

cyan() {
    echo -e "\e[36m${1}\e[0m"
}

gray() {
    echo -e "\e[90m${1}\e[0m"
}

black 'BLACK'
red 'RED'
green 'GREEN'
yellow 'YELLOW'
blue 'BLUE'
magenta 'MAGENTA'
cyan 'CYAN'
gray 'GRAY'

在线试用

18赞 Bruno Bronosky 2/7/2020 #24

我应该使用 .tput

这是我最喜欢的演示脚本:

#!/bin/bash

tput init

end=$(( $(tput colors)-1 ))
w=8
for c in $(seq 0 $end); do
    eval "$(printf "tput setaf %3s   " "$c")"; echo -n "$_"
    [[ $c -ge $(( w*2 )) ]] && offset=2 || offset=0
    [[ $(((c+offset) % (w-offset))) -eq $(((w-offset)-1)) ]] && echo
done

tput init

256 colors output by tput

10赞 Ivan 2/14/2020 #25

我正在用它来进行彩色打印

#!/bin/bash
#--------------------------------------------------------------------+
#Color picker, usage: printf $BLD$CUR$RED$BBLU'Hello World!'$DEF     |
#-------------------------+--------------------------------+---------+
#       Text color        |       Background color         |         |
#-----------+-------------+--------------+-----------------+         |
# Base color|Lighter shade| Base color   | Lighter shade   |         |
#-----------+-------------+--------------+-----------------+         |
BLK='\e[30m'; blk='\e[90m'; BBLK='\e[40m'; bblk='\e[100m' #| Black   |
RED='\e[31m'; red='\e[91m'; BRED='\e[41m'; bred='\e[101m' #| Red     |
GRN='\e[32m'; grn='\e[92m'; BGRN='\e[42m'; bgrn='\e[102m' #| Green   |
YLW='\e[33m'; ylw='\e[93m'; BYLW='\e[43m'; bylw='\e[103m' #| Yellow  |
BLU='\e[34m'; blu='\e[94m'; BBLU='\e[44m'; bblu='\e[104m' #| Blue    |
MGN='\e[35m'; mgn='\e[95m'; BMGN='\e[45m'; bmgn='\e[105m' #| Magenta |
CYN='\e[36m'; cyn='\e[96m'; BCYN='\e[46m'; bcyn='\e[106m' #| Cyan    |
WHT='\e[37m'; wht='\e[97m'; BWHT='\e[47m'; bwht='\e[107m' #| White   |
#-------------------------{ Effects }----------------------+---------+
DEF='\e[0m'   #Default color and effects                             |
BLD='\e[1m'   #Bold\brighter                                         |
DIM='\e[2m'   #Dim\darker                                            |
CUR='\e[3m'   #Italic font                                           |
UND='\e[4m'   #Underline                                             |
INV='\e[7m'   #Inverted                                              |
COF='\e[?25l' #Cursor Off                                            |
CON='\e[?25h' #Cursor On                                             |
#------------------------{ Functions }-------------------------------+
# Text positioning, usage: XY 10 10 'Hello World!'                   |
XY () { printf "\e[$2;${1}H$3"; }                                   #|
# Print line, usage: line - 10 | line -= 20 | line 'Hello World!' 20 |
line () { printf -v _L %$2s; printf -- "${_L// /$1}"; }             #|
# Create sequence like {0..(X-1)}                                    |
que () { printf -v _N %$1s; _N=(${_N// / 1}); printf "${!_N[*]}"; } #|
#--------------------------------------------------------------------+

所有基本颜色都设置为变量,并且还有一些有用的功能:XY、line 和 que。将此脚本源在您的脚本之一中,并使用所有颜色变量和函数。

27赞 Pascal Polleunus 4/4/2020 #26

当我在寻找有关该主题的信息时,我找到了 Shakiba Moshiri 的精彩答案......然后我有了一个主意......它最终形成了一个非常好的功能,非常易于使用 😁
所以我必须分享它 😉

https://github.com/ppo/bash-colors

用法:在或$(c <flags>)echo -eprintf

 ┌───────┬─────────────────┬──────────┐   ┌───────┬─────────────────┬──────────┐
 │ Code  │ Style           │ Octal    │   │ Code  │ Style           │ Octal    │
 ├───────┼─────────────────┼──────────┤   ├───────┼─────────────────┼──────────┤
 │   -   │ Foreground      │ \033[3.. │   │   B   │ Bold            │ \033[1m  │
 │   _   │ Background      │ \033[4.. │   │   U   │ Underline       │ \033[4m  │
 ├───────┼─────────────────┼──────────┤   │   F   │ Flash/blink     │ \033[5m  │
 │   k   │ Black           │ ......0m │   │   N   │ Negative        │ \033[7m  │
 │   r   │ Red             │ ......1m │   ├───────┼─────────────────┼──────────┤
 │   g   │ Green           │ ......2m │   │   L   │ Normal (unbold) │ \033[22m │
 │   y   │ Yellow          │ ......3m │   │   0   │ Reset           │ \033[0m  │
 │   b   │ Blue            │ ......4m │   └───────┴─────────────────┴──────────┘
 │   m   │ Magenta         │ ......5m │
 │   c   │ Cyan            │ ......6m │
 │   w   │ White           │ ......7m │
 └───────┴─────────────────┴──────────┘

例子:

echo -e "$(c 0wB)Bold white$(c) and normal"
echo -e "Normal text… $(c r_yB)BOLD red text on yellow background… $(c _w)now on
  white background… $(c 0U) reset and underline… $(c) and back to normal."
1赞 Mauro 6/26/2020 #27

这里有一个简单的脚本,可以在 bash shell promt 中轻松管理文本样式:

https://github.com/ferromauro/bash-palette

使用以下命令导入代码:

source bash-palette.sh

在 echo 命令中使用导入的变量(使用 -e 选项!

echo -e ${PALETTE_GREEN}Color Green${PALETTE_RESET}

可以组合更多元素:

echo -e ${PALETTE_GREEN}${PALETTE_BLINK}${PALETTE_RED_U}Green Blinking Text over Red Background${PALETTE_RESET}

enter image description here

2赞 joharr 9/30/2020 #28

受到@nachoparker回答的启发,我在我的回答中写道:.bashrc

#### colours
source xcol.sh

### tput foreground
export tpfn=$'\e[0m' # normal
export tpfb=$(tput bold)

## normal colours
export tpf0=$(tput setaf 0) # black
export tpf1=$(tput setaf 1) # red
export tpf2=$(tput setaf 2) # green
export tpf3=$(tput setaf 3) # yellow
export tpf4=$(tput setaf 4) # blue
export tpf5=$(tput setaf 5) # magenta
export tpf6=$(tput setaf 6) # cyan
export tpf7=$(tput setaf 7) # white
# echo "${tpf0}black ${tpf1}red ${tpf2}green ${tpf3}yellow ${tpf4}blue ${tpf5}magenta ${tpf6}cyan ${tpf7}white${tpfn}"

## bold colours
export tpf0b="$tpfb$tpf0" # bold black
export tpf1b="$tpfb$tpf1" # bold red
export tpf2b="$tpfb$tpf2" # bold green
export tpf3b="$tpfb$tpf3" # bold yellow
export tpf4b="$tpfb$tpf4" # bold blue
export tpf5b="$tpfb$tpf5" # bold magenta
export tpf6b="$tpfb$tpf6" # bold cyan
export tpf7b="$tpfb$tpf7" # bold white
# echo "${tpf0b}black ${tpf1b}red ${tpf2b}green ${tpf3b}yellow ${tpf4b}blue ${tpf5b}magenta ${tpf6b}cyan ${tpf7b}white${tpfn}"

允许我在 Bash 脚本中使用它们。exporttpf..

10赞 Flash Ang 11/14/2020 #29

您可以“组合”颜色和文本模式。

#!/bin/bash

echo red text / black background \(Reverse\)
echo "\033[31;7mHello world\e[0m";
echo -e "\033[31;7mHello world\e[0m";
echo

echo yellow text / red background
echo "\033[32;41mHello world\e[0m";
echo -e "\033[32;41mHello world\e[0m";
echo "\033[0;32;41mHello world\e[0m";
echo -e "\033[0;32;41mHello world\e[0m";
echo

echo yellow BOLD text / red background
echo "\033[1;32;41mHello world\e[0m";
echo -e "\033[1;32;41mHello world\e[0m";
echo

echo yellow BOLD text underline / red background
echo "\033[1;4;32;41mHello world\e[0m";
echo -e "\033[1;4;32;41mHello world\e[0m";
echo "\033[1;32;4;41mHello world\e[0m";
echo -e "\033[1;32;4;41mHello world\e[0m";
echo "\033[4;32;41;1mHello world\e[0m";
echo -e "\033[4;32;41;1mHello world\e[0m";
echo

enter image description here

57赞 wytten 1/21/2021 #30

我对托比亚斯的回答的即兴演奏:

# Color
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m' # No Color

function red {
    printf "${RED}$@${NC}\n"
}

function green {
    printf "${GREEN}$@${NC}\n"
}

function yellow {
    printf "${YELLOW}$@${NC}\n"
}

$ echo $(red apple) $(yellow banana) $(green kiwi)
apple banana kiwi

21赞 Mojtaba Hosseini 5/8/2021 #31

表情符号

您可以做的一件事,答案中没有提到,那就是使用表情符号为您的输出着色!

echo 📕: error message
echo 📙: warning message
echo 📗: ok status message
echo 📘: action message
echo 📔: Or anything you like and want to recognize immediately by color
echo 💩: Or with a specific emoji

🎁 奖金附加值

此方法非常有用,尤其是当脚本的源代码编辑器支持显示 Unicode 时。然后,您还可以在运行之前直接在源代码中看到彩色脚本!:

VSCode demo VSCode 内部脚本文件的图像

注意:您可能需要直接传递表情符号的Unicode:

echo $'\U0001f972'  // this emoji: 🥲

请注意 Unicode 字符的大写字母 U >= 10000


此外,这种情况非常罕见,但您可能需要像这样传递代码:

echo <0001f972>

感谢评论中的@joanis提到这一点

评论

3赞 joanis 6/19/2021
这是一个有趣的想法,但是表情符号的颜色不会在我的终端中呈现,它们都被转换为当前输出的颜色。
0赞 joanis 6/19/2021
另外,对我不起作用。该语法在什么情况下有效?对于 Unicode 字符 <=ffff,有效,但不适用于 >=10000。echo <0001f972>echo $'\u1234'
0赞 joanis 6/19/2021
刚刚找到了 >=10000 的答案:大写字母 U.(通过猜测 bash 和 vim 可能相互模仿,从 unix.stackexchange.com/a/280481/327696 中找出了答案)echo $'\U0001f972'
34赞 coldfix 10/20/2021 #32

其他答案已经很好地解释了如何做到这一点。我仍然缺少的是对颜色代码的精心安排的概述。维基百科文章“ANSI转义码”对此非常有帮助。但是,由于颜色通常可以在每个终端中配置和看起来不同,因此我更喜欢在终端中调用一个函数。为此,我创建了以下函数来显示颜色表并提醒我如何设置它们(其排列灵感来自 wiki 文章)。例如,您可以将它们加载到您的 .bashrc/.zshrc 中,或者将它们作为脚本放在某个地方。

256 色

enter image description here

enter image description here

由此 bash/zsh 脚本生成:

function showcolors256() {
    local row col blockrow blockcol red green blue
    local showcolor=_showcolor256_${1:-bg}
    local white="\033[1;37m"
    local reset="\033[0m"

    echo -e "Set foreground color: \\\\033[38;5;${white}NNN${reset}m"
    echo -e "Set background color: \\\\033[48;5;${white}NNN${reset}m"
    echo -e "Reset color & style:  \\\\033[0m"
    echo

    echo 16 standard color codes:
    for row in {0..1}; do
        for col in {0..7}; do
            $showcolor $(( row*8 + col )) $row
        done
        echo
    done
    echo

    echo 6·6·6 RGB color codes:
    for blockrow in {0..2}; do
        for red in {0..5}; do
            for blockcol in {0..1}; do
                green=$(( blockrow*2 + blockcol ))
                for blue in {0..5}; do
                    $showcolor $(( red*36 + green*6 + blue + 16 )) $green
                done
                echo -n "  "
            done
            echo
        done
        echo
    done

    echo 24 grayscale color codes:
    for row in {0..1}; do
        for col in {0..11}; do
            $showcolor $(( row*12 + col + 232 )) $row
        done
        echo
    done
    echo
}

function _showcolor256_fg() {
    local code=$( printf %03d $1 )
    echo -ne "\033[38;5;${code}m"
    echo -nE " $code "
    echo -ne "\033[0m"
}

function _showcolor256_bg() {
    if (( $2 % 2 == 0 )); then
        echo -ne "\033[1;37m"
    else
        echo -ne "\033[0;30m"
    fi
    local code=$( printf %03d $1 )
    echo -ne "\033[48;5;${code}m"
    echo -nE " $code "
    echo -ne "\033[0m"
}

16 种颜色

enter image description here

由此 bash/zsh 脚本生成:

function showcolors16() {
    _showcolor "\033[0;30m" "\033[1;30m" "\033[40m" "\033[100m"
    _showcolor "\033[0;31m" "\033[1;31m" "\033[41m" "\033[101m"
    _showcolor "\033[0;32m" "\033[1;32m" "\033[42m" "\033[102m"
    _showcolor "\033[0;33m" "\033[1;33m" "\033[43m" "\033[103m"
    _showcolor "\033[0;34m" "\033[1;34m" "\033[44m" "\033[104m"
    _showcolor "\033[0;35m" "\033[1;35m" "\033[45m" "\033[105m"
    _showcolor "\033[0;36m" "\033[1;36m" "\033[46m" "\033[106m"
    _showcolor "\033[0;37m" "\033[1;37m" "\033[47m" "\033[107m"
}

function _showcolor() {
    for code in $@; do
        echo -ne "$code"
        echo -nE "   $code"
        echo -ne "   \033[0m  "
    done
    echo
}

评论

0赞 Casaper 10/5/2022
你介意吗,如果我在提供 colr 和 bgcolr 函数的 oh my zsh 插件中使用您在这里发布的函数?例如,它会 .它的重点是 zsh 完成(屏幕截图)。@coldfix ?echo -e "$(colr 11 'yellow') normal $(colr 124 'some red')"
0赞 coldfix 10/6/2022
@Casaper,考虑这些公共领域是没问题的。
12赞 Oli Girling 11/8/2021 #33

这是我最终使用的sed

echo " [timestamp] production.FATAL Some Message\n" \
"[timestamp] production.ERROR Some Message\n" \
"[timestamp] production.WARNING Some Message\n" \
"[timestamp] production.INFO Some Message\n" \
"[timestamp] production.DEBUG Some Message\n"  | sed \
-e "s/FATAL/"$'\e[31m'"&"$'\e[m'"/" \
-e "s/ERROR/"$'\e[31m'"&"$'\e[m'"/" \
-e "s/WARNING/"$'\e[33m'"&"$'\e[m'"/" \
-e "s/INFO/"$'\e[32m'"&"$'\e[m'"/" \
-e "s/DEBUG/"$'\e[34m'"&"$'\e[m'"/"

像这样的打印:Mac sed output to colour