Skip to content

颜色和样式的文本

ANSI 转义码

解释

  • printf:Shell 中用于格式化输出的命令。
  • \033[...m:这是 ANSI 转义序列,用于控制终端的文本颜色和样式。
    • \033 是转义字符(Esc),表示开始一个 ANSI 转义序列。
    • [ 是 ANSI 转义序列的开始标志。
    • 911 是颜色和样式的代码。
    • m 表示结束 ANSI 转义序列。
  • \033[91;1m
    • 91:设置文本颜色为亮红色。
    • 1:设置文本样式为粗体。
    • 结合使用 91;1,表示亮红色粗体文本。
  • \033[0m
    • 0:重置所有颜色和样式。
    • 用于恢复终端的默认样式。

ANSI 颜色代码

ANSI 颜色代码:

  • 文本颜色
    • 30:黑色
    • 31:红色
    • 32:绿色
    • 33:黄色
    • 34:蓝色
    • 35:洋红色
    • 36:青色
    • 37:白色
    • 90:亮黑色
    • 91:亮红色
    • 92:亮绿色
    • 93:亮黄色
    • 94:亮蓝色
    • 95:亮洋红色
    • 96:亮青色
    • 97:亮白色
  • 文本样式
    • 0:重置所有样式
    • 1:粗体
    • 2:暗淡
    • 3:斜体
    • 4:下划线
    • 5:闪烁
    • 7:反色
    • 8:隐藏

示例

sh
#!/bin/bash

# 输出红色粗体的警告信息
printf "\033[91;1mDEPRECATION WARNING\033[0m\n"
printf "\033[91;1mThis feature is deprecated and will be removed in a future version.\033[0m\n"

# 输出绿色粗体的提示信息
printf "\033[92;1mTIP\033[0m\n"
printf "\033[92;1mPlease use the new feature instead.\033[0m\n"

tput 命令详解

tput 是一个用于 终端控制 的 Shell 命令,它可以查询和修改终端的文本样式、颜色、光标位置等。它比直接使用 ANSI 转义码(如 \033[31m)更可移植,适用于不同的终端类型(如 xtermlinuxtmux 等)。


1. 基本语法

sh
tput <capname> [args...]
  • capname:终端能力名称(如 colorsboldsetaf 等)。
  • args:某些能力需要额外参数(如颜色代码)。

2. 常见用途

(1) 查询终端信息

命令说明示例输出
tput colors终端支持的颜色数量816256
tput lines终端的行数24
tput cols终端的列数80
tput longname终端类型的长名称xterm-256color

示例

sh
echo "当前终端支持 $(tput colors) 种颜色"

(2) 文本样式控制

命令作用对应 ANSI 转义码
tput bold加粗文本\033[1m
tput dim暗淡文本\033[2m
tput smul下划线\033[4m
tput rmul取消下划线\033[24m
tput rev反色显示\033[7m
tput sgr0重置所有样式\033[0m

示例

echo "$(tput bold)加粗文本$(tput sgr0) 普通文本"

(3) 颜色控制

前景色(文字颜色)
sh
tput setaf <颜色代码>  # 0-7 或 0-255(取决于终端支持)
代码颜色
0黑色
1红色
2绿色
3黄色
4蓝色
5紫色
6青色
7白色

示例

echo "$(tput setaf 2)绿色文字$(tput sgr0)"
背景色sh
sh
tput setab <颜色代码>  # 同上

示例:

echo "$(tput setab 4)$(tput setaf 7)蓝底白字$(tput sgr0)"

(4) 光标控制

命令作用示例
tput cup <行> <列>移动光标到指定位置tput cup 5 10
tput civis隐藏光标tput civis
tput cnorm显示光标tput cnorm
tput clear清屏tput clear

示例

sh
tput cup 10 20
echo "光标移动到第10行第20列"

(5) 其他功能

命令作用
tput bel响铃(发出提示音)
tput flash屏幕闪烁
tput reset重置终端(类似 reset 命令)

3. 实际应用示例

(1) 彩色输出脚本

sh
#!/bin/bash

# 检测终端是否支持颜色
if [ "$(tput colors)" -ge 8 ]; then
    RED=$(tput setaf 1)
    GREEN=$(tput setaf 2)
    BOLD=$(tput bold)
    RESET=$(tput sgr0)
else
    RED=""
    GREEN=""
    BOLD=""
    RESET=""
fi

echo "${BOLD}${RED}错误:${RESET} 这是一个${GREEN}示例${RESET}"

(2) 进度条动画

sh
#!/bin/bash

echo -n "处理中 "
for i in {1..10}; do
    echo -n "."
    sleep 0.2
done
tput cub 10  # 回退10个字符
echo "完成!"

输出效果

sh
处理中 ..........
完成!

(3) 终端界面布局

#!/bin/bash

clear
tput cup 2 10
echo "==== 菜单 ===="
tput cup 4 5
echo "1. 开始"
tput cup 5 5
echo "2. 退出"
tput cup 7 5
read -p "选择: " choice

效果

复制

sh
          ==== 菜单 ====
     1. 开始
     2. 退出
     选择:

4. 注意事项

  1. 兼容性
    • tput 的行为取决于终端的 TERM 环境变量(如 xterm-256color)。
    • 始终检查 tput colors 以确保颜色支持。
  2. 重置样式
    • 使用 tput sgr0 重置样式,避免影响后续输出。
  3. 脚本可移植性
    • 比硬编码 ANSI 转义码(如 \033[31m)更可靠。
  4. 非终端环境
    • 如果输出被重定向到文件(如 script.sh > log.txt),tput 可能不生效。

5. 总结

  • tput终端控制的标准化方式,适用于:
    • 彩色输出
    • 光标定位
    • 文本样式(加粗、下划线等)
    • 查询终端属性(颜色支持、行列数等)
  • 优势
    • 比 ANSI 转义码更可移植。
    • 自动适配不同终端类型。
  • 推荐场景
    • 命令行工具开发
    • 交互式脚本
    • 终端 UI 布局