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

我试图打印一个文本在终端使用回声命令。

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

1673788 次浏览
echo -e "\033[31m Hello World"

[31m控制文本颜色:

  • 30-37前台
  • 40-47背景

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

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

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

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

您可以使用这些ANSI转义码

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

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

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

打印love为红色。

来自@James Lim的评论,如果您使用的是#0命令,请务必使用-e标志来允许反斜杠转义

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

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

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


用法

具体的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生成的字符序列被终端解释为具有特殊含义。它们不会自己显示。请注意,它们仍然可以保存到文件中或由终端以外的程序作为输入进行处理。

命令替换

使用命令替换tput的输出直接插入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 escapetput setaf [1-7] # Set the foreground colour using ANSI escape

颜色如下:

Num  Colour    #define         R G B
0    black     COLOR_BLACK     0,0,01    red       COLOR_RED       1,0,02    green     COLOR_GREEN     0,1,03    yellow    COLOR_YELLOW    1,1,04    blue      COLOR_BLUE      0,0,15    magenta   COLOR_MAGENTA   1,0,16    cyan      COLOR_CYAN      0,1,17    white     COLOR_WHITE     1,1,1

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

文本模式命令

tput bold    # Select bold modetput dim     # Select dim (half-bright) modetput smul    # Enable underline modetput rmul    # Disable underline modetput rev     # Turn on reverse video modetput smso    # Enter standout (bold) modetput 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 uptput ll      # Move to last line, first column (if no cup)tput sc      # Save the cursor positiontput rc      # Restore the cursor positiontput lines   # Output the number of lines of the terminaltput cols    # Output the number of columns of the terminal

清除和插入命令

tput ech N   # Erase N characterstput clear   # Clear screen and move the cursor to 0,0tput el 1    # Clear to beginning of linetput el      # Clear to end of linetput ed      # Clear to end of screentput 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 defaulttput bel     # Play a bell

使用摇晃的窗口bel命令使终端摆动一秒钟以引起用户的注意。


脚本

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

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

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

另见

  • #0
  • 有关命令的完整列表和这些选项的更多详细信息,请参阅#0。(相应的tput命令列在第81行开始的大表格的Cap-name列中。)

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

function coloredEcho(){local exp=$1;local color=$2;if ! [[ $color =~ '^[0-9]$' ]] ; thencase $(echo $color | tr '[:upper:]' '[:lower:]') inblack) 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 coloresacfitput setaf $color;echo $exp;tput sgr0;}

用法:

coloredEcho "This text is green" green

或者您可以直接使用Drew的回答中提到的颜色代码:

coloredEcho "This text is green" 2
red='\e[0;31m'NC='\e[0m' # No Colorecho -e "${red}Hello Stackoverflow${NC}"

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

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

应该做的把戏。

为了易读性

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

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

这些代码在我的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

输入图片描述

这是彩色开关\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" inblack  | 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!"

您可以使用的一些变量:

# ResetColor_Off='\033[0m'       # Text Reset
# Regular ColorsBlack='\033[0;30m'        # BlackRed='\033[0;31m'          # RedGreen='\033[0;32m'        # GreenYellow='\033[0;33m'       # YellowBlue='\033[0;34m'         # BluePurple='\033[0;35m'       # PurpleCyan='\033[0;36m'         # CyanWhite='\033[0;37m'        # White
# BoldBBlack='\033[1;30m'       # BlackBRed='\033[1;31m'         # RedBGreen='\033[1;32m'       # GreenBYellow='\033[1;33m'      # YellowBBlue='\033[1;34m'        # BlueBPurple='\033[1;35m'      # PurpleBCyan='\033[1;36m'        # CyanBWhite='\033[1;37m'       # White
# UnderlineUBlack='\033[4;30m'       # BlackURed='\033[4;31m'         # RedUGreen='\033[4;32m'       # GreenUYellow='\033[4;33m'      # YellowUBlue='\033[4;34m'        # BlueUPurple='\033[4;35m'      # PurpleUCyan='\033[4;36m'        # CyanUWhite='\033[4;37m'       # White
# BackgroundOn_Black='\033[40m'       # BlackOn_Red='\033[41m'         # RedOn_Green='\033[42m'       # GreenOn_Yellow='\033[43m'      # YellowOn_Blue='\033[44m'        # BlueOn_Purple='\033[45m'      # PurpleOn_Cyan='\033[46m'        # CyanOn_White='\033[47m'       # White
# High IntensityIBlack='\033[0;90m'       # BlackIRed='\033[0;91m'         # RedIGreen='\033[0;92m'       # GreenIYellow='\033[0;93m'      # YellowIBlue='\033[0;94m'        # BlueIPurple='\033[0;95m'      # PurpleICyan='\033[0;96m'        # CyanIWhite='\033[0;97m'       # White
# Bold High IntensityBIBlack='\033[1;90m'      # BlackBIRed='\033[1;91m'        # RedBIGreen='\033[1;92m'      # GreenBIYellow='\033[1;93m'     # YellowBIBlue='\033[1;94m'       # BlueBIPurple='\033[1;95m'     # PurpleBICyan='\033[1;96m'       # CyanBIWhite='\033[1;97m'      # White
# High Intensity backgroundsOn_IBlack='\033[0;100m'   # BlackOn_IRed='\033[0;101m'     # RedOn_IGreen='\033[0;102m'   # GreenOn_IYellow='\033[0;103m'  # YellowOn_IBlue='\033[0;104m'    # BlueOn_IPurple='\033[0;105m'  # PurpleOn_ICyan='\033[0;106m'    # CyanOn_IWhite='\033[0;107m'   # White

bash十六进制八进制中的转义字符:

|       | 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-Terend上完全支持。

2.文本模式

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

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

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

3.前台模式

此模式用于着色前景。

4.后台模式

此模式用于着色背景。

下表显示了ANSI-Color的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-Color的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-Color的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 ||------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|

一些屏幕截图

.gif中的前台8位摘要

foreground.gif

.gif中的背景8位摘要

background.gif

颜色摘要及其值

输入图片描述在此处输入图片描述在此处输入图片描述输入图片描述

blinking在KDE终端

KDE闪烁

一个简单的'C'代码,向您展示更多

cecho_screenshot

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

bline


彩色模式拍摄

淡入正常亮度

文本模式拍摄

只使用文本模式

组合就OK

组合

更多的镜头


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

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

是的,你可以。我经历了9;bash&9;" rel="tag">bash,9;c&9;" rel="tag">c,9;c++&9;" rel="tag">c++,

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

我认为,不。

我们可以在Windows上使用它们吗?

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

如何计算代码长度?

\033[=2,其他部分1

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

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

#!/usr/bin/perl -nprint "\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科罗拉多字符)中,然后将文件a放在有效的PATH中,然后在您喜欢的任何地方使用它。

ls | pcc
df | pcc

mysql中,首先将其注册为pager,然后尝试:

[user2:db2] pager pccPAGER 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位表示:000000000000000000000000。每个8位用于特定的颜色。
1..8表示9..16表示17..24表示
所以在#FF0000表示,这里是:255;0;0
#00FF00表示,这里是:0;255;0
这有意义吗?你想要什么颜色与这三个8位值结合起来。


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

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

function echocolor() { # $1 = stringCOLOR='\033[1;33m'NC='\033[0m'printf "${COLOR}$1${NC}\n"}
echo "This won't be colored"echocolor "This will be colorful"

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

只是为了发布另一个选项,你可以看看这个小工具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

xcolexample

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

此工具使用以下定义

#normal=$(tput sgr0)                      # normal textnormal=$'\e[0m'                           # (works better sometimes)bold=$(tput bold)                         # make colors bold/brightred="$bold$(tput setaf 1)"                # bright red textgreen=$(tput setaf 2)                     # dim green textfawn=$(tput setaf 3); beige="$fawn"       # dark yellow textyellow="$bold$fawn"                       # bright yellow textdarkblue=$(tput setaf 4)                  # dim blue textblue="$bold$darkblue"                     # bright blue textpurple=$(tput setaf 5); magenta="$purple" # magenta textpink="$bold$purple"                       # bright magenta textdarkcyan=$(tput setaf 6)                  # dim cyan textcyan="$bold$darkcyan"                     # bright cyan textgray=$(tput setaf 7)                      # dim white textdarkgray="$bold"$(tput setaf 0)           # bold black = dark gray textwhite="$bold$gray"                        # bright white text

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

echo "${red}hello ${yellow}this is ${green}coloured${normal}"

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

for (( i = 0; i < 8; i++ )); dofor (( j = 0; j < 8; j++ )); doprintf "$(tput setab $i)$(tput setaf $j)(b=$i, f=$j)$(tput sgr0)\n"donedone

我写了赃物来实现这一点。

你可以只做

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

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

感谢@k-5的回答

declare -A colors#curl www.bunlongheng.com/code/colors.png
# Resetcolors[Color_Off]='\033[0m'       # Text Reset
# Regular Colorscolors[Black]='\033[0;30m'        # Blackcolors[Red]='\033[0;31m'          # Redcolors[Green]='\033[0;32m'        # Greencolors[Yellow]='\033[0;33m'       # Yellowcolors[Blue]='\033[0;34m'         # Bluecolors[Purple]='\033[0;35m'       # Purplecolors[Cyan]='\033[0;36m'         # Cyancolors[White]='\033[0;37m'        # White
# Boldcolors[BBlack]='\033[1;30m'       # Blackcolors[BRed]='\033[1;31m'         # Redcolors[BGreen]='\033[1;32m'       # Greencolors[BYellow]='\033[1;33m'      # Yellowcolors[BBlue]='\033[1;34m'        # Bluecolors[BPurple]='\033[1;35m'      # Purplecolors[BCyan]='\033[1;36m'        # Cyancolors[BWhite]='\033[1;37m'       # White
# Underlinecolors[UBlack]='\033[4;30m'       # Blackcolors[URed]='\033[4;31m'         # Redcolors[UGreen]='\033[4;32m'       # Greencolors[UYellow]='\033[4;33m'      # Yellowcolors[UBlue]='\033[4;34m'        # Bluecolors[UPurple]='\033[4;35m'      # Purplecolors[UCyan]='\033[4;36m'        # Cyancolors[UWhite]='\033[4;37m'       # White
# Backgroundcolors[On_Black]='\033[40m'       # Blackcolors[On_Red]='\033[41m'         # Redcolors[On_Green]='\033[42m'       # Greencolors[On_Yellow]='\033[43m'      # Yellowcolors[On_Blue]='\033[44m'        # Bluecolors[On_Purple]='\033[45m'      # Purplecolors[On_Cyan]='\033[46m'        # Cyancolors[On_White]='\033[47m'       # White
# High Intensitycolors[IBlack]='\033[0;90m'       # Blackcolors[IRed]='\033[0;91m'         # Redcolors[IGreen]='\033[0;92m'       # Greencolors[IYellow]='\033[0;93m'      # Yellowcolors[IBlue]='\033[0;94m'        # Bluecolors[IPurple]='\033[0;95m'      # Purplecolors[ICyan]='\033[0;96m'        # Cyancolors[IWhite]='\033[0;97m'       # White
# Bold High Intensitycolors[BIBlack]='\033[1;90m'      # Blackcolors[BIRed]='\033[1;91m'        # Redcolors[BIGreen]='\033[1;92m'      # Greencolors[BIYellow]='\033[1;93m'     # Yellowcolors[BIBlue]='\033[1;94m'       # Bluecolors[BIPurple]='\033[1;95m'     # Purplecolors[BICyan]='\033[1;96m'       # Cyancolors[BIWhite]='\033[1;97m'      # White
# High Intensity backgroundscolors[On_IBlack]='\033[0;100m'   # Blackcolors[On_IRed]='\033[0;101m'     # Redcolors[On_IGreen]='\033[0;102m'   # Greencolors[On_IYellow]='\033[0;103m'  # Yellowcolors[On_IBlue]='\033[0;104m'    # Bluecolors[On_IPurple]='\033[0;105m'  # Purplecolors[On_ICyan]='\033[0;106m'    # Cyancolors[On_IWhite]='\033[0;107m'   # White

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


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

结果

在此处输入图片描述

希望这个图像可以帮助你为你的bash选择颜色:D

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

首先使用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)已在20世纪90年代的X/Open curses语义学中可用(1997年标准具有下面提到的语义学)。

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

我们可以将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

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

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

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

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

也就是说,我写了一个名为深色的小助手库,它在tput之上添加了另一个层,使用起来更简单(imho):

示例:色调白色(青色(T)洋红色(I)黄色(N)黑色(T))是粗体(真的)易于使用。

将给出以下结果:输入图片描述

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

#!/usr/bin/bash
W="Hello world!"echo $W
R=130G=60B=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 $Yecho u.bold($Y)

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

我刚刚合并了所有解决方案中的良好捕获,最后得到:

cecho(){RED="\033[0;31m"GREEN="\033[0;32m"  # <-- [0 means not boldYELLOW="\033[1;33m" # <-- [1 means boldCYAN="\033[1;36m"# ... Add more colors if you like
NC="\033[0m" # No Color
# printf "${(P)1}${2} ${NC}\n" # <-- zshprintf "${!1}${2} ${NC}\n" # <-- bash}

你可以这样称呼它:

cecho "RED" "Helloworld"

在此处输入图片描述

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

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

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

在线试用

I而不是硬编码特定于您当前终端的转义码,您应该使用tput

这是我最喜欢的demo脚本:

#!/bin/bash
tput init
end=$(( $(tput colors)-1 ))w=8for c in $(seq 0 $end); doeval "$(printf "tput setaf %3s   " "$c")"; echo -n "$_"[[ $c -ge $(( w*2 )) ]] && offset=2 || offset=0[[ $(((c+offset) % (w-offset))) -eq $(((w-offset)-1)) ]] && echodone
tput init

tput输出256色

我正在使用这个进行彩色打印

#!/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[*]}"; } #|#--------------------------------------------------------------------+

所有基本颜色都设置为vars,还有一些有用的函数:XY、line和que。在您的一个中获取此脚本并使用所有颜色vars和函数。

当我在寻找这个主题的信息时,我发现了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 onwhite background… $(c 0U) reset and underline… $(c) and back to normal."

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

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}

输入图片描述

受到@nachoparker答案的启发,我的.bashrc中有这个:

#### colourssource xcol.sh
### tput foregroundexport tpfn=$'\e[0m' # normalexport tpfb=$(tput bold)
## normal coloursexport tpf0=$(tput setaf 0) # blackexport tpf1=$(tput setaf 1) # redexport tpf2=$(tput setaf 2) # greenexport tpf3=$(tput setaf 3) # yellowexport tpf4=$(tput setaf 4) # blueexport tpf5=$(tput setaf 5) # magentaexport tpf6=$(tput setaf 6) # cyanexport tpf7=$(tput setaf 7) # white# echo "${tpf0}black ${tpf1}red ${tpf2}green ${tpf3}yellow ${tpf4}blue ${tpf5}magenta ${tpf6}cyan ${tpf7}white${tpfn}"
## bold coloursexport tpf0b="$tpfb$tpf0" # bold blackexport tpf1b="$tpfb$tpf1" # bold redexport tpf2b="$tpfb$tpf2" # bold greenexport tpf3b="$tpfb$tpf3" # bold yellowexport tpf4b="$tpfb$tpf4" # bold blueexport tpf5b="$tpfb$tpf5" # bold magentaexport tpf6b="$tpfb$tpf6" # bold cyanexport 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..

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

#!/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 backgroundecho "\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 backgroundecho "\033[1;32;41mHello world\e[0m";echo -e "\033[1;32;41mHello world\e[0m";echo
echo yellow BOLD text underline / red backgroundecho "\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

在此处输入图片描述

订阅关于Tobias的评论:

# ColorRED='\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$(红苹果)$(黄香蕉)$(绿猕猴桃)苹果香蕉猕猴桃

表情符号

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

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

🎁奖金增值

此方法非常有用,尤其是当您的脚本源编辑器支持显示Unicode时。然后您甚至可以在运行它之前看到丰富多彩的脚本和直接在源头!:

VSCode demoVSCode中的脚本文件图像

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

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

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


,非常罕见,但您可能需要像这样传递代码:

echo <0001f972>

感谢@joanis从评论中提到这个

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

256色

在此处输入图片描述

在此处输入图片描述

由这个bash/zsh脚本生成:

function showcolors256() {local row col blockrow blockcol red green bluelocal 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}; dofor col in {0..7}; do$showcolor $(( row*8 + col )) $rowdoneechodoneecho
echo 6·6·6 RGB color codes:for blockrow in {0..2}; dofor red in {0..5}; dofor blockcol in {0..1}; dogreen=$(( blockrow*2 + blockcol ))for blue in {0..5}; do$showcolor $(( red*36 + green*6 + blue + 16 )) $greendoneecho -n "  "doneechodoneechodone
echo 24 grayscale color codes:for row in {0..1}; dofor col in {0..11}; do$showcolor $(( row*12 + col + 232 )) $rowdoneechodoneecho}
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 )); thenecho -ne "\033[1;37m"elseecho -ne "\033[0;30m"filocal 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 $@; doecho -ne "$code"echo -nE "   $code"echo -ne "   \033[0m  "doneecho}

这就是我最终使用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将输出转换为颜色