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


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

我想用红色打印文本。我怎样才能做到这一点?


1150
2018-05-10 09:07


起源


这个链接非常有用: misc.flogisoft.com/bash/tip_colors_and_formatting - Pithikos
你想改变什么样的颜色? - Jasur Kurbanov
看看这个,我在那里回答了你的问题: stackoverflow.com/a/48216286/3782119 - SHi ON


答案:


你可以使用这些 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标志来允许反斜杠转义。

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

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


1569
2018-05-10 09:11



对我不起作用 - 输出: \e[0;31mHello Stackoverflow\e[0m - Ben Harold
你用“-e”试了吗?它说 echo 启用反斜杠转义。 - James Lim
+1好酷! :)顺便问一下,你在哪里获得这些数字,它们是终端程序和Linux发行版的标准吗? - Bitdiot
在MacOSX中,使用 \x1B 代替 \e。 \033 适用于所有平台。 - Xiao
就像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 - everyman


你可以使用真棒 tput 命令(建议在 伊格纳西奥的回答)为各种事物生成终端控制代码。


用法

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

直接

呼叫 tput 作为一系列命令的一部分:

tput setaf 1; echo "this is red text"

使用 ; 代替 && 因此,如果 tput 文本仍显示错误。

Shell变量

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

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

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

命令替换

插入可能更方便 tput直接输出到你的 echo 字符串使用 命令替换

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版本的颜色设置功能(setb 代替 setab,和 setf 代替 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摇摇欲坠的窗户bel 命令使终端摆动一秒钟以引起用户的注意。


脚本

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

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

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

也可以看看

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

651
2018-01-07 22:25



很好的答案。这是最能帮助我的人。对于其他任何想知道我在想什么的人, $() 是一个 命令替换。所有 tput af 1 是生成颜色代码字符串,但代码不是可打印字符,所以输入 tput af 1 单独会产生一个空白的输出线。 - Chris Middleton
注意:如果您使用CygWin并且没有tput安装 ncurses - Enrico
tput也可以在sed内部解析,以便将其翻译成易读的,色彩鲜艳的: gist.github.com/nickboldt/fab71da10bd5169ffdfa - nickboldt
这比直接使用颜色代码要好得多! - Kyle Strand
是大多数发行版的一部分吗? - Nepoxx


您可以使用的一些变量:

# 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

 

逃亡角色 庆典十六进制 和 八进制 分别:

|       | bash  | hex    | octal   | NOTE                         |
|-------+-------+--------+---------+------------------------------|
| start | \e    | \x1b   | \033    |                              |
| start | \E    | \x1B   | -       | x cannot be capital          |
| end   | \e[0m | \x1m0m | \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种模式:

色彩模式

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

  • 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-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[32m |         |       | yellow           | echo -e "\033[33m####\033[m" |                                      |
|         34 | \033[32m |         |       | blue             | echo -e "\033[34m####\033[m" |                                      |
|         35 | \033[32m |         |       | purple           | echo -e "\033[35m####\033[m" | real name: magenta = reddish-purple  |
|         36 | \033[32m |         |       | cyan             | echo -e "\033[36m####\033[m" |                                      |
|         37 | \033[32m |         |       | 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颜色的版本

|------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|
| 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颜色的版本

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

 

一些屏幕截图

a中的前景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位是的,如果您使用编译代码 gcc
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)然后将文件放入有效状态 PATH 然后在任何你喜欢的地方使用它

ls | pcc
df | pcc 

mysql 首先注册它 pager 然后尝试:

[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 

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

它很容易使用 3/4-bit,但它使用起来非常准确和美观 24-bit
如果你没有经验  所以这是一个快速教程:
24位表示: 00000000 和 00000000 和 00000000。每个8位用于特定颜色。
24..17 是为了  和 16..9 对于  和 8..1 对于
所以   #FF0000 手段  这是: 255;0;0
  #00FF00 手段  这是: 0;255;0
那有意义吗?你想要什么颜色将它与这三个8位值结合起来。


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

徽章:


465
2018-03-09 09:02



我特别喜欢它 shell, hex 和 oct 信息。 - Fredrick Gauss
当然很好的答案,但我无法全部阅读...谢谢! - Worker
@ShakibaMoshiri我的文章现在有颜色!谢谢! - Worker
太长!好的博客文章;你可以将其减少到最小的细节,然后链接到其他地方进行完整阅读? - Duncan Jones
@DuncanJones我想成为一个参考。这只是一个非常简短的细节。我删掉了很多。 - Shakiba Moshiri


使用 tput 随着 setaf 能力和参数 1

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

158
2018-05-10 09:10



这应该是最好的选择。什么 tput的 它会读取终端信息并为您呈现正确转义的ANSI代码。代码就像 \033[31m 会打破 的ReadLine 某些终端的图书馆。 - Tian Chen
通过简单的循环探索颜色(增加 i更多阴影的上限): for (( i = 0; i < 17; i++ )); do echo "$(tput setaf $i)This is ($i) $(tput sgr0)"; done - msanford
这是关于tput代码的HOWTO: tldp.org/HOWTO/Bash-Prompt-HOWTO/x405.html - maxywb
为什么它也会改变其他线条的颜色? - zygimantus
@zygimantus这就是shell颜色代码的工作方式:它们会一直存在,直到它们被重置。 tput sgr0 应该重置代码,所以你应该 不 如果你逐字复制上面的行,就会看到持续的效果。 - Kyle Strand


echo -e "\033[31m Hello World"

[31m 控制文字颜色:

  • 30 - 37 套 前景 颜色
  • 40 - 47 套 背景 颜色

更完整的颜色代码列表 可以在这里找到

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


96
2018-05-10 09:10



@ Neo-你可以提供颜色代码的链接 - satheesh.droid
echo -e“\ 033 [31m Hello World”,[31m是颜色 - Neo


这是 彩色开关  \033[。看到 历史

颜色 代码 像 1;32 (浅绿色), 0;34 (蓝色), 1;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!"

29
2018-02-25 01:38



我改变了最后一个 text 变量 text="$color${@: 2}${code}0m" 这样,除了颜色参数之外的整行将被着色。 - Shairon Toledo
不知道为什么,但是使用带有“echo”的代码并没有为输出着色,而是打印代码。当用“printf”替换它时,彩色文本起作用。 - tomazahlin
@tomazahlin只是添加-e到echo,如上所述 - Artem Medvedev


一种改变颜色的巧妙方法 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

25
2018-04-11 07:36



如果你添加 -n 回声然后你可以使用它作为内联着色 echo "Red `coloredEcho "fox" red` jumps over the lazy dog" - sobi3ch


使用 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"

18
2018-04-04 10:37





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

首先使用 tput 在现代环境中比手动注入ASCII代码更便携 echo -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

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

tput(1) 已经在20世纪90年代的X / Open curses语义中可用(1997年标准具有下面提到的语义)。

所以就是 (相当无处不在。


13
2017-09-20 21:02



这很酷!不知道这个。你能谈谈有关的可用性吗? tput?它是否可用于大多数没有管理员安装权限的服务器上?你有这个技术最初“发明”的链接吗? - Redsandro
tput是符合标准的方式,它完全独立于您了解终端功能。如果终端不支持给定的功能,它将优雅地降级到它可以做的任何事情,而不会推出棘手的转义码。 - Ahmed Masud
我已停止使用此方法,因为它在bash行中的光标位置混乱。它将在行尾之前随机换行,并且在使用home或箭头键时不会一直返回到行的开头。回到笨拙的手动转义码可以解决这个问题。 - Redsandro
@Resandro - 是因为你正在使用它 $PS1 无 \[...\] 在非间距部分周围?继续使用带有tput字符串的Bash PS1标记。 - Toby Speight


这些代码适用于我的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 (( i = 0; i < 17; i++ )); 
do echo "$(tput setaf $i)This is ($i) $(tput sgr0)"; 
done

enter image description here


10
2017-09-05 18:40



顺便说一句:这并不依赖于安装特定版本的ubuntu,而是使用PuTTY! - urzeit