How to change the output color of echo in Linux

How to change the output color of echo in Linux

技术背景

在Linux系统中,有时需要改变echo命令输出的颜色,以提高信息的可读性和区分度。实现这一目的通常借助ANSI转义码或者tput命令。ANSI转义码是一套用于控制终端文本显示格式(如颜色、样式等)的代码,而tput命令则是一个更为通用和可移植的工具,它可以根据终端类型生成相应的控制代码。

实现步骤

使用ANSI转义码

  1. 了解ANSI颜色代码:ANSI颜色代码由一系列数字组成,用于指定文本的颜色和样式。例如,30 - 37用于设置前景色,40 - 47用于设置背景色。
  2. 在脚本中使用ANSI转义码:在echo命令中使用-e选项以允许解释转义字符,然后插入相应的ANSI转义码。

示例代码如下:

1
2
3
RED='\033[0;31m'
NC='\033[0m' # No Color
echo -e "I ${RED}love${NC} Stack Overflow"

使用tput命令

  1. 了解tput子命令tput提供了许多子命令,用于设置不同的终端属性,如颜色、样式、光标位置等。
  2. 在脚本中使用tput命令:可以直接调用tput命令,也可以将其输出保存到变量中使用。

示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
# 直接调用
tput setaf 1; echo "this is red text"

# 使用变量
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0`
echo "${red}red text ${green}green text${reset}"

# 命令替换
echo "$(tput setaf 1)Red text $(tput setab 7)and white background$(tput sgr 0)"

核心代码

ANSI转义码常用颜色变量定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# 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

使用tput命令的示例函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;
}

最佳实践

  • 使用函数封装:将颜色设置和输出逻辑封装到函数中,提高代码的复用性和可维护性。
  • 使用tput提高可移植性tput命令会根据终端类型生成相应的控制代码,因此更具可移植性,建议优先使用。
  • 及时重置颜色:在每次颜色设置后,使用重置代码(如\033[0mtput sgr0)将颜色和样式恢复到默认状态,避免影响后续输出。

常见问题

  • ANSI转义码不生效:可能是因为没有使用echo -e选项,或者终端不支持ANSI转义码。可以尝试使用tput命令来解决。
  • 在特殊bash变量中使用ANSI转义码出现问题:如果在PS0PS1PS2PS4等特殊bash变量中使用ANSI转义码,需要添加额外的转义字符\[\],以确保bash能够正确解释它们。
  • 颜色显示不一致:不同的终端可能对颜色的显示有所差异,建议使用tput命令来提高颜色显示的一致性。

How to change the output color of echo in Linux
https://119291.xyz/posts/how-to-change-the-output-color-of-echo-in-linux/
作者
ww
发布于
2025年5月13日
许可协议