本文目录导读:

在Shell脚本中实现颜色输出主要使用ANSI转义序列(Escape Sequences),下面是完整的实现指南:
基础颜色代码
文字颜色(Foreground Colors)
# 定义颜色变量 BLACK='\033[0;30m' RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m' BLUE='\033[0;34m' PURPLE='\033[0;35m' CYAN='\033[0;36m' WHITE='\033[0;37m' # 重置颜色 NC='\033[0m' # No Color
背景颜色(Background Colors)
BG_BLACK='\033[0;40m' BG_RED='\033[0;41m' BG_GREEN='\033[0;42m' BG_YELLOW='\033[0;43m' BG_BLUE='\033[0;44m' BG_PURPLE='\033[0;45m' BG_CYAN='\033[0;46m' BG_WHITE='\033[0;47m'
基本使用方法
#!/bin/bash
# 定义颜色
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m' # 无颜色
# 使用颜色输出
echo -e "${RED}这是红色文字${NC}"
echo -e "${GREEN}这是绿色文字${NC}"
echo -e "${RED}红色${NC}和${GREEN}绿色${NC}混合"
样式控制
# 不同样式
BOLD='\033[1m' # 粗体
DIM='\033[2m' # 暗色
UNDERLINE='\033[4m' # 下划线
BLINK='\033[5m' # 闪烁
REVERSE='\033[7m' # 反色
HIDDEN='\033[8m' # 隐藏
# 示例
echo -e "${BOLD}${RED}粗体红色${NC}"
echo -e "${UNDERLINE}${GREEN}带下划线的绿色${NC}"
完整的颜色函数
#!/bin/bash
# 颜色定义
declare -A COLORS
COLORS=(
["black"]="30"
["red"]="31"
["green"]="32"
["yellow"]="33"
["blue"]="34"
["purple"]="35"
["cyan"]="36"
["white"]="37"
)
# 颜色输出函数
color_echo() {
local color=$1
local text=$2
local style=${3:-0} # 0=普通, 1=粗体, 4=下划线
if [[ -n "${COLORS[$color]}" ]]; then
echo -e "\033[${style};${COLORS[$color]}m${text}\033[0m"
else
echo "$text"
fi
}
# 使用示例
color_echo "red" "错误信息" 1 # 粗体红色
color_echo "green" "成功信息" # 普通绿色
color_echo "yellow" "警告信息" 4 # 黄色下划线
高级用法
#!/bin/bash
# 带颜色的日志函数
log_info() {
echo -e "\033[0;36m[INFO] $(date '+%Y-%m-%d %H:%M:%S') - $1\033[0m"
}
log_success() {
echo -e "\033[1;32m[SUCCESS] $(date '+%Y-%m-%d %H:%M:%S') - $1\033[0m"
}
log_warning() {
echo -e "\033[1;33m[WARNING] $(date '+%Y-%m-%d %H:%M:%S') - $1\033[0m"
}
log_error() {
echo -e "\033[1;31m[ERROR] $(date '+%Y-%m-%d %H:%M:%S') - $1\033[0m"
}
log_debug() {
echo -e "\033[0;37m[DEBUG] $(date '+%Y-%m-%d %H:%M:%S') - $1\033[0m"
}
# 使用
log_info "系统启动中..."
log_success "操作完成"
log_warning "磁盘空间不足"
log_error "连接失败"
256色支持
#!/bin/bash
# 256色输出函数
color256() {
local color=$1
local text=$2
echo -e "\033[38;5;${color}m${text}\033[0m"
}
# 使用示例
for i in {0..255}; do
color256 $i "Color $i"
done
RGB真彩色支持
#!/bin/bash
# RGB颜色输出
rgb_echo() {
local r=$1
local g=$2
local b=$3
local text=$4
echo -e "\033[38;2;${r};${g};${b}m${text}\033[0m"
}
# 示例
rgb_echo 255 0 0 "纯红色"
rgb_echo 0 255 0 "纯绿色"
rgb_echo 0 0 255 "纯蓝色"
实用示例:进度条
#!/bin/bash
progress_bar() {
local current=$1
local total=$2
local width=50
local percent=$((current * 100 / total))
local filled=$((current * width / total))
local empty=$((width - filled))
# 颜色定义
local green='\033[0;32m'
local red='\033[0;31m'
local nc='\033[0m'
printf "\r[${green}"
printf "%${filled}s" | tr ' ' '█'
printf "${red}"
printf "%${empty}s" | tr ' ' '░'
printf "${nc}] %3d%%" $percent
}
# 使用
for i in $(seq 1 100); do
progress_bar $i 100
sleep 0.05
done
echo
注意事项
- 使用
-e参数:echo命令需要-e参数来解析转义序列 - 重置颜色:始终使用
\033[0m或${NC}重置颜色 - 兼容性:某些终端可能不支持所有颜色特性
- 变量引用:用双引号包裹变量,防止特殊字符问题
检测终端颜色支持
#!/bin/bash
# 检测是否支持颜色
if [ -t 1 ]; then
ncolors=$(tput colors)
if [ -n "$ncolors" ] && [ $ncolors -ge 8 ]; then
echo "终端支持颜色输出"
else
echo "终端不支持颜色"
fi
fi
这些方法可以让你在Shell脚本中创建美观的输出,适用于日志系统、进度显示、状态提示等场景。