Shell脚本如何实现颜色输出

wen 实用脚本 3

本文目录导读:

Shell脚本如何实现颜色输出

  1. 基础颜色代码
  2. 基本使用方法
  3. 样式控制
  4. 完整的颜色函数
  5. 高级用法
  6. 256色支持
  7. RGB真彩色支持
  8. 实用示例:进度条
  9. 注意事项
  10. 检测终端颜色支持

在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

注意事项

  1. 使用-e参数:echo命令需要-e参数来解析转义序列
  2. 重置颜色:始终使用\033[0m${NC}重置颜色
  3. 兼容性:某些终端可能不支持所有颜色特性
  4. 变量引用:用双引号包裹变量,防止特殊字符问题

检测终端颜色支持

#!/bin/bash
# 检测是否支持颜色
if [ -t 1 ]; then
    ncolors=$(tput colors)
    if [ -n "$ncolors" ] && [ $ncolors -ge 8 ]; then
        echo "终端支持颜色输出"
    else
        echo "终端不支持颜色"
    fi
fi

这些方法可以让你在Shell脚本中创建美观的输出,适用于日志系统、进度显示、状态提示等场景。

抱歉,评论功能暂时关闭!