在 Bash shell 中,颜色通常通过 ANSI 转义序列(Escape Sequences)实现,用于改变终端文本的前景色、背景色或样式(如加粗、斜体等)。以下是 Bash shell 中颜色的详细讲解:


1. ANSI 转义序列基础

ANSI 转义序列以 \033[\e[ 开头,后面跟着一系列数字和字母,用于设置颜色和样式,最后以 m 结束。例如:

1
echo -e "\033[31mHello, World!\033[0m"
  • \033[31m:将文本设置为红色。
  • \033[0m:重置颜色和样式,恢复默认。

格式

1
\033[<样式>;<前景色>;<背景色>m
  • <样式>:控制文本样式(如加粗、下划线)。
  • <前景色>:设置文本颜色。
  • <背景色>:设置背景颜色(可选)。

2. 颜色代码

前景色(文本颜色)

颜色代码说明
黑色30Black
红色31Red
绿色32Green
黄色33Yellow
蓝色34Blue
紫色35Magenta
青色36Cyan
白色37White

背景色

颜色代码说明
黑色40Black
红色41Red
绿色42Green
黄色43Yellow
蓝色44Blue
紫色45Magenta
青色46Cyan
白色47White

高亮/加深颜色(Bright Colors)

高亮颜色通过在前景色或背景色代码前加 1; 实现。例如:

  • 高亮红色前景色:\033[1;31m
  • 高亮红色背景色:\033[1;41m

样式

样式代码说明
重置0Reset all
加粗1Bold
暗淡2Dim
下划线4Underline
闪烁5Blink
反显7Reverse
隐藏8Hidden

3. 使用示例

以下是一些在 Bash 中使用颜色的示例:

基本颜色

1
2
3
echo -e "\033[31mThis is red text\033[0m"
echo -e "\033[32mThis is green text\033[0m"
echo -e "\033[41mThis is white text on red background\033[0m"
  • 输出红色文本、绿色文本和红底白字文本。

组合样式和颜色

1
2
3
echo -e "\033[1;34mThis is bold blue text\033[0m"
echo -e "\033[4;33mThis is underlined yellow text\033[0m"
echo -e "\033[1;31;42mThis is bold red text on green background\033[0m"
  • 组合加粗、下划线、前景色和背景色。

循环显示所有前景色

1
2
3
for i in {30..37}; do
echo -e "\033[${i}mColor code ${i}\033[0m"
done

循环显示所有背景色

1
2
3
for i in {40..47}; do
echo -e "\033[${i}mBackground color code ${i}\033[0m"
done

4. 256 色模式

现代终端支持 256 色模式,使用 \033[38;5;<n>m(前景色)或 \033[48;5;<n>m(背景色),其中 <n> 是 0-255 的颜色编号。

示例

1
2
echo -e "\033[38;5;208mThis is orange (color 208)\033[0m"
echo -e "\033[48;5;55mThis is text on purple background (color 55)\033[0m"

查看 256 色表

1
2
3
4
for i in {0..255}; do
printf "\033[38;5;${i}mColor %-3d\033[0m " $i
if [ $((($i + 1) % 16)) == 0 ]; then echo; fi
done

5. True Color(真彩色)

部分现代终端(如 iTerm2、GNOME Terminal)支持 24 位真彩色,使用 RGB 值设置颜色:

1
2
\033[38;2;<R>;<G>;<B>m  # 前景色
\033[48;2;<R>;<G>;<B>m # 背景色
  • <R>, <G>, <B> 是 0-255 的红、绿、蓝值。

示例

1
2
echo -e "\033[38;2;255;165;0mThis is orange (RGB: 255,165,0)\033[0m"
echo -e "\033[48;2;0;128;128mThis is text on teal background (RGB: 0,128,128)\033[0m"

6. 注意事项

  1. 终端支持

    • 不同终端对颜色的支持程度不同(例如,Windows CMD 不支持 ANSI 序列,需使用 WSL 或第三方终端)。
    • 检查终端是否支持 256 色或真彩色:echo $TERM(如 xterm-256color 表示支持 256 色)。
  2. **echo -e**:

    • 使用 echo 时需加 -e 参数以解析转义序列。
    • 或者使用 printf,如:printf "\033[31mHello\033[0m\n"
  3. 重置颜色

    • 总是使用 \033[0m 重置样式,否则后续输出可能受影响。
  4. **环境变量 PS1**:

    • 在提示符中添加颜色,例如:
      1
      PS1='\[\033[1;32m\]\u@\h:\w\$\[\033[0m\] '
      • \u:用户名,\h:主机名,\w:工作目录。

7. 实际应用

  • 美化脚本输出:通过颜色区分错误(红色)、警告(黄色)、成功(绿色)。
  • 自定义提示符:在 .bashrc 中设置彩色 PS1。
  • 日志高亮:在脚本中使用颜色标记关键信息。

示例脚本

1
2
3
4
5
6
7
#!/bin/bash
RED='\033[31m'
GREEN='\033[32m'
RESET='\033[0m'

echo -e "${RED}Error: Something went wrong!${RESET}"
echo -e "${GREEN}Success: Operation completed!${RESET}"

8. 常见问题

  • 颜色不显示
    • 确保终端支持 ANSI 序列。
    • 检查是否漏加 -eecho)或是否正确转义。
  • 颜色代码记不住
    • 定义变量存储常用颜色代码(如上例中的 REDGREEN)。
  • 跨平台兼容性
    • Windows 终端需使用 PowerShell 或 WSL2 才能很好支持 ANSI 颜色。