海量编程文章、技术教程与实战案例

网站首页 > 技术文章 正文

How to change the output color of echo in Linux

yimeika 2025-06-08 22:10:51 技术文章 7 ℃

技术背景

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

实现步骤

使用ANSI转义码

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

示例代码如下:

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

使用tput命令

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

示例代码如下:

# 直接调用
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转义码常用颜色变量定义

# 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命令的示例函数

function coloredEcho(){
    local exp=$1;
    local color=$2;
    if ! [[ $color =~ '^[0-9]#39; ]] ; 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命令来提高颜色显示的一致性。

Tags:

最近发表
标签列表