【问题标题】:How to change the output color of echo in Linux如何在 Linux 中更改 echo 的输出颜色
【发布时间】:2026-02-10 11:40:02
【问题描述】:

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

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

【问题讨论】:

标签: linux bash command-line echo terminal-color


【解决方案1】:

你可以使用这些ANSI escape codes:

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 标志以允许反斜杠转义

# Continued from above example
echo -e "I ${RED}love${NC} Stack Overflow"

(使用echo时不要添加"\n",除非您想添加额外的空行)

【讨论】:

  • 对我不起作用 -- 输出:\e[0;31mHello *\e[0m
  • 你用“-e”试过了吗?它告诉echo 启用反斜杠转义。
  • 在 MacOSX 中,使用 \x1B 而不是 \e\033 适用于所有平台。
  • 在 ant 属性文件中使用 unicode 作为 esacpe,例如红色=\u001b[0;31m
  • 就像 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
【解决方案2】:

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


用法

具体的tput 子命令稍后讨论。

直接

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

tput setaf 1; echo "this is red text"

使用; 而不是&&,因此如果tput 出错,文本仍会显示。

外壳变量

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

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

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

命令替换

使用command substitutiontput 的输出直接插入echo 字符串可能更方便:

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

示例

上面的命令在 Ubuntu 上产生这个:


前景色和背景色命令

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 版本的颜色设置函数(setb 代替 setabsetf 代替 setaf)使用不同的数字,此处未给出。

文本模式命令

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 wobbly windowsbel 命令使终端摇晃一秒钟以引起用户的注意。


脚本

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

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

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

另见

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

【讨论】:

  • 很好的答案。这是对我帮助最大的一个。对于其他想知道我想知道什么的人,$()command substitutiontput af 1 所做的只是生成颜色代码字符串,但代码不是可打印字符,因此单独输入 tput af 1 会产生一个空行输出。
  • 注意:如果您使用的是 CygWin 并且没有 tput install ncurses
  • tput 也可以在 sed 中使用,用于将 cruft 解析为清晰、多彩的 cruft:gist.github.com/nickboldt/fab71da10bd5169ffdfa
  • 查看tput颜色的完整列表check out this answer on the Unix StackExchange
  • @monkeypants From what I can see sgr0 专门用于重置(关闭)属性。 sgr 0 可能也可以完成这个角色,但sgr 是一个更通用的命令,允许更改属性。
【解决方案3】:

您可以使用的一些变量:

# 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
  • PS1
  • PS2(= 这是为了提示)
  • PS4

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

bash 的异常规则

您应该在任何起始 ANSI 代码之前添加 \[,并在任何结束代码之后添加 \]
示例:
经常使用:\033[32mThis is in green\033[0m
对于 PS0/1/2/4:\[\033[32m\]This is in green\[\033[m\]

\[ 用于 不可打印 字符序列的开头
\] 用于不可打印 字符序列的结尾

提示:为了记住它,您可以先添加\[\],然后将您的 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 支持 5; 但 Gnome-Terminal 不支持,Gnome 支持 8; 但 KDE 不支持。

3。前台模式

此模式用于为前景着色。

4。后台模式

此模式用于为背景着色。

下表显示了3/4位版本的ANSI-color

|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
| 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                                            |                                                                                       |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|

下表显示了8位版本的ANSI-color

|------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|
| 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

下表显示了24位版本的ANSI-color

|------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|
| 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 |
|------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|

一些截图

.gif 中的前景 8 位摘要

.gif 中的背景 8 位摘要

颜色摘要及其值

blinking 在 KDE 终端上

一个简单的 `C` 代码,向您展示更多内容

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


彩色模式拍摄

文字模式拍摄

合并就OK了

more shots


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

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

是的,你可以。我经历过

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

我认为,不。

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

3/4-bit 是的,如果你用gcc编译代码
some screen-shots on Win-7

如何计算代码长度?

\033[ = 2,其他部分 1

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

任何有 tty 解释器的地方
xtermgnome-terminalkde-terminalmysql-client-CLI 等等。
例如,如果你想用 mysql 为你的输出着色,你可以使用Perl

#!/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;

将此代码存储在文件名中:pcc(= Perl Colorize Character),然后将文件 a 放入有效的 PATH,然后在您喜欢的任何地方使用它。

ls | pcc
df | pcc

mysql里面先注册pager再试试:

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

它确实处理 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

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

3/4-bit好用,24-bit用起来更准确、更漂亮。
如果您没有使用 的经验,那么这里有一个快速教程:
24 位表示:000000000000000000000000。每个 8 位用于特定颜色。
1..8 用于 和 9..16 用于 和 17..24 用于
所以在 #FF0000 表示 是:255;0;0
#00FF00 表示 这是:0;255;0
那有意义吗?你想要什么颜色与这三个 8 位值结合起来。


参考:
Wikipedia
ANSI escape sequences
tldp.org
tldp.org
misc.flogisoft.com
一些我不记得的博客/网页

【讨论】:

  • @NeilGuyLindberg 没有八进制文字这个错误是 Node.js 的一部分而不是 eslist 本身。您可以使用x1B[ 来消除它。
  • @ShakibaMoshiri 在您仔细阅读ANSI escape sequences 之前,从答案中不清楚如何组合颜色。请注意:echo -e "\033[97;44;1m text \033[m" 将在蓝色背景 (;44) 上输出粗体 (;1) 白色文本 (;97),\033[0m 重置所有文本属性 (0)。它还取决于终端的颜色模式。
【解决方案4】:

tputsetaf 功能和1 参数一起使用。

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

【讨论】:

  • 这应该是最好的选择。 tput 的作用是读取终端信息并为您呈现正确转义的 ANSI 代码。 \033[31m 之类的代码会破坏某些终端中的 readline 库。
  • 用一个简单的循环探索颜色(增加i的上限以获得更多阴影):for (( i = 0; i &lt; 17; i++ )); do echo "$(tput setaf $i)This is ($i) $(tput sgr0)"; done
  • 这是关于 tput 代码的 HOWTO:tldp.org/HOWTO/Bash-Prompt-HOWTO/x405.html
  • 同意@TianChen,像\033[31m这样的代码在用于输出文本的程序不兼容此类命令时也会产生一些不相关的字符。另一方面,tput + setafcommands 不会,使输出完全可读。请参阅@BenHarold 的评论,说:“对我不起作用——输出:\e[0;31mHello *\e[0m
【解决方案5】:
echo -e "\033[31m Hello World"

[31m 控制文字颜色:

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

更完整的颜色代码列表can be found here

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

【讨论】:

  • echo -e "\033[31m Hello World",[31m是颜色
【解决方案6】:

我刚刚合并了所有解决方案中的优点并最终得到:

cecho(){
    RED="\033[0;31m"
    GREEN="\033[0;32m"
    YELLOW="\033[1;33m"
    # ... ADD MORE COLORS
    NC="\033[0m" # No Color
    # ZSH
    # printf "${(P)1}${2} ${NC}\n"
    # Bash
    printf "${!1}${2} ${NC}\n"
}

你可以把它称为:

cecho "RED" "Helloworld"

【讨论】:

  • 非常实用,我只需要将 GREEN、YELLOW、NC 的单引号替换为双引号,即可在我的脚本中使用。
  • 我在显示文件内容时遇到了一些问题。用echo 替换printf 帮助我解决了这个问题。
  • 在 zsh 中我得到:替换错误
  • @AdrianLopez 感谢您的关注! ZSH 中的indirect variable reference 使用${(P)1} 而不是${!1} 用于bash。我已经编辑了答案并将两者都包括在内。
【解决方案7】:

我对 Tobias 的回答的重复:

# 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"
}

【讨论】:

    【解决方案8】:

    这是颜色开关 \033[。见history

    颜色codes 类似于1;32(浅绿色)、0;34(蓝色)、1;34(浅蓝色)等。

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

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

    【讨论】:

    • 我会将最后一个text 变量更改为text="$color${@: 2}${code}0m",这样除了颜色参数之外的整行都会被着色。
    • @tomazahlin 只需在 echo 中添加 -e,如上所述多次
    • 正如 Wilfred Hughes 所建议的,最好使用 tput,因为它更便携 - 也适用于 macOS 上的 Bash。因此,我实际上建议从这个答案中使用 Alireza Mirian 的函数:*.com/a/23006365/2693875
    【解决方案9】:

    只为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
    

    或者您可以直接使用Drew's answer中提到的颜色代码:

    coloredEcho "This text is green" 2
    

    【讨论】:

    • 如果将-n 添加到echo 中,则可以将其用作内联着色echo "Red `coloredEcho "fox" red` jumps over the lazy dog"
    【解决方案10】:

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

    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"
    

    【讨论】:

      【解决方案11】:

      我在查找有关该主题的信息时发现 Shakiba Moshiri 的真棒答案……然后我有了一个想法……它最终变成了一个非常好用的功能?
      所以我必须分享它?

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

      用法: $(c &lt;flags&gt;)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."
      

      【讨论】:

        【解决方案12】:

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

        首先使用tput在现代环境中比通过echo -E手动注入ASCII码更便携

        这是一个快速的 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]] 
        

        得到:

        tput 的可移植性说明

        第一次tput(1)源代码于1986年9月上传

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

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

        【讨论】:

        • 这很酷!不知道这个。你能谈谈tput 的可用性吗?它在大多数没有管理员权限的服务器上都可用吗?你有这个技术最初“发明”的链接吗?
        • tput 是执行此操作的标准兼容方式,它完全独立于您了解终端功能。如果终端不支持给定的功能,它将优雅地降级到它可以做的任何事情,而不会推出令人费解的转义码。
        • 我已经停止使用这种方法,因为它会混淆 bash 行中的光标位置。它会在行尾之前随机换行,并且在使用 home 或箭头键时不会一直回到行首。回到笨拙的手动转义码可以解决这个问题。
        • @Resandro - 是因为您在$PS1 中使用它,而在非间距部分周围没有\[...\]?继续使用带有 tput 字符串的 Bash PS1 标记。
        • 我们可以设置光标位置,行列,使用类似ansi转义序列。
        【解决方案13】:

        感谢 @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
        

        结果

        希望image 可以帮助您为 bash 选择颜色:D

        【讨论】:

        • 需要注意的是,这需要bash v4。
        【解决方案14】:

        如果您使用的是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'
        

        Try online

        【讨论】:

          【解决方案15】:

          我们可以为文本和背景使用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";
          

          这是更改终端内置方案时的外观:

          这是用于 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

          【讨论】:

          • 适应zsh for i in {30..49};do echo -e "\033[$i;7mReversed color code $i\e[0m Hello world\!";done
          【解决方案16】:

          您应该使用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
          

          【讨论】:

            【解决方案17】:

            这些代码适用于我的 Ubuntu 机器:

            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
            

            【讨论】:

            • 顺便说一句:这并不取决于安装了特定版本的 ubuntu,而是使用 PuTTY!
            【解决方案18】:

            为了可读性

            如果你想提高代码的可读性,你可以先echo字符串,然后再使用sed添加颜色:

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

            【讨论】:

            • 我真的很喜欢这个答案!你能解释一下 sed 命令中的 $ 吗?
            • $'' 用于 bash,而不是 sed。它告诉 bash 将 \e 作为转义序列处理,并在其中放入一个“转义”字符。通常您会看到更简单的形式,例如 $'\t' 或 $'\n' 来获取一个制表符或换行符传递给命令。
            【解决方案19】:

            以您可以制作的不同颜色显示消息输出:

            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

            【讨论】:

              【解决方案20】:

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

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

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

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

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

              请注意,它接受 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}"
              

              【讨论】:

                【解决方案21】:

                我正在使用this 进行彩色打印

                #!/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,线条和que。在您的一个脚本中获取此脚本并使用所有颜色变量和函数。

                【讨论】:

                  【解决方案22】:

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

                  #!/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
                  

                  【讨论】:

                    【解决方案23】:

                    表情符号

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

                    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中的脚本文件图片

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

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

                    注意 大写 U 用于 Unicode 字符 >= 10000


                    另外,这种情况很少见,但您可能需要像这样传递代码:

                    echo <0001f972>
                    

                    感谢 cmets 的 @joanis 提及这一点

                    【讨论】:

                    • 这是一个有趣的想法,但是表情符号的颜色并没有在我的终端中呈现,它们都被转换为当前输出的颜色。
                    • 另外,echo &lt;0001f972&gt; 不适合我。该语法在什么情况下有效?对于 Unicode 字符 echo $'\u1234' 有效,但不适用于 >=10000。
                    • 刚刚找到了 >=10000 的答案:echo $'\U0001f972',大写字母 U。(通过猜测 bash 和 vim 可能相互模仿,从 unix.stackexchange.com/a/280481/327696 算出)
                    【解决方案24】:

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

                    256 色

                    由此 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 色

                    由此 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
                    }
                    

                    【讨论】:

                      【解决方案25】:

                      扩展this answer,为我们这些懒人:

                      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"
                      

                      【讨论】:

                      • 不要硬编码终端转义。使用tput;这就是它的用途!
                      • @TobySpeight 虽然这对于多平台支持(理论上)可能是正确的,但如果发布者发现它在他们自己的世界中有效,为什么不同意并劝阻类似世界的其他人使用该技术?举个例子,我在 Ubuntu 16.04 bash 中尝试了类似的方法,它可以工作。作为这个平台上唯一的用户,我觉得这个答案是可以接受的。不过,我也会将tput 用于scrc(保存光标,恢复光标)。虽然这个答案称我为“懒惰”,但它可以改写为“实用”或“直截了当”。
                      【解决方案26】:

                      您绝对应该在原始 ANSI 控制序列上使用 tput。

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

                      这些命令之一是 tputtput 接受一组名为 能力名称和任何参数,如果合适,然后查找 terminfo 中检测到的终端的正确转义序列 数据库并打印正确的代码(希望终端 明白)。

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

                      会给出以下结果:

                      【讨论】:

                        【解决方案27】:

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

                        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
                        

                        【讨论】:

                          【解决方案28】:

                          我写了swag 来实现这一点。

                          你可以这样做

                          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

                          【讨论】:

                            【解决方案29】:

                            受@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}"
                            

                            export 允许我在 Bash 脚本中使用那些 tpf..

                            【讨论】:

                              【解决方案30】:

                              这就是我最终使用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'"/"
                              

                              这样打印:

                              【讨论】: