如何在 Linux Shell 脚本中进行彩色字体输出

Posted on Mon, 01 Dec 2025 10:20:59 +0800 by LiangMingJian


需求

在编写 Linux Shell 运维脚本时,有时候会想要输出一些执行日志,这些日志会分为 INFO,WARN,ERROR 这几个等级。而为了在脚本输出时快速的在终端中分辨日志等级,我们会希望这些日志在输出时变更字体颜色,使用不同的颜色进行输出。

功能实现

Linux 支持通过 ANSI 转义码来控制终端文本的颜色,比如下面的颜色代码:

文本颜色(前景色)

  • 黑色:\033[30m
  • 红色:\033[31m
  • 绿色:\033[32m
  • 黄色:\033[33m
  • 蓝色:\033[34m
  • 紫色:\033[35m
  • 青色:\033[36m
  • 白色:\033[37m
  • 默认:\033[39m
  • 重置:\033[0m

文本背景(背景色)

  • 黑色:\033[40m
  • 红色:\033[41m
  • 绿色:\033[42m
  • 黄色:\033[43m
  • 蓝色:\033[44m
  • 紫色:\033[45m
  • 青色:\033[46m
  • 白色:\033[47m
  • 默认:\033[49m
  • 重置:\033[0m

上述的 ANSI 颜色转义码可以分为三段记忆:首先 \033 表示的是该转义码使用八进制代码,然后 [ 表示命令分隔,最后的 30m 就是真实的颜色代码。

在 Shell 脚本中使用上述颜色代码时,通常需要使用 echo 的 -e 参数,用来输出带有转义字符的字符串,让 echo 可以解析并处理字符串中的特殊转义字符,然后输出颜色。

特别注意,颜色代码使用后,会对整个终端生效,直到下次使用颜色代码或者进行重置

比如执行 echo -e "\033[32mHello" 会导致整个终端变为绿色。

因此,在使用颜色代码时,通常会在同一行最后面添加重置代码或者默认颜色代码来让终端输出恢复正常。

比如执行 echo -e "\033[32mHello\033[0m",此时的输出就会正常。

默认代码 \033[39m\033[49m 和重置代码 \033[0m 的区别在于,默认代码只会将颜色修改为默认颜色,而重置代码不仅会修改颜色还会将字体样式修改为原样。

此外,ANSI 转义码不仅可以控制颜色,还可以控制字体样式,比如下述代码:

  • 粗体:\033[1m
  • 虚化:\033[2m
  • 斜体:\033[3m
  • 下划线:\033[4m
  • 闪烁:\033[5m
  • 反向:\033[7m
  • 隐形:\033[8m
  • 删除线:\033[9m

最后,ANSI 转义码支持复合使用,多个转义码使用分号 ; 分隔,比如:

  • 绿色的斜体字:echo -e "\033[32;3mHello\033[0m"
  • 黄色的斜体删除字:echo -e "\033[33;3;9mHello\033[0m"

代码示例

在实际编写 Shell 脚本时,建议将日志输出封装为一个函数使用,比如下述示例:

#!/bin/bash

# 遇到错误立即退出
set -e

# 颜色定义用于输出
RED='\033[31m'
GREEN='\033[32m'
YELLOW='\033[33m'
RESET='\033[0m'

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO] $1 ${RESET}"
}
log_warn() {
    echo -e "${YELLOW}[WARN] $1 ${RESET}"
}
log_error() {
    echo -e "${RED}[ERROR] $1 ${RESET}"
}

log_info "这是信息,颜色是绿色"
log_warn "这是警告,颜色是黄色"
log_error "这是错误,颜色是红色"

————————————

Shell 脚本中的彩色输出

ANSI 转义序列