1491 字
7 分钟
Shell printf

相比常用的echo命令,我们在使用bash时经常会忽视自带的printf命令,转而使用其他语言的print函数, 但其实printf命令起源于C语言中的printf()函数,它的行为与C语言非常相似。 它提供了更多的格式化选项,让输出控制更加精确。

基本语法#

Terminal window
printf "格式字符串" [参数1] [参数2] ...

其中:

  • 格式字符串:包含普通字符和格式说明符
  • 参数:要格式化的值,可以有多个

格式说明符#

printf支持多种格式说明符,常用的包括:

说明符说明
%s字符串
%d十进制整数
%f浮点数
%c字符
%x十六进制数(小写)
%X十六进制数(大写)
%o八进制数
%e科学计数法(小写e)
%E科学计数法(大写E)

基本示例#

Terminal window
# 字符串格式化
printf "Hello, %s!\n" "World"
# 数字格式化
printf "Dec: %d,Hex: %x,Oct: %o\n" 255 255 255
# 浮点数格式化
printf "%f,保留2位小数:%.2f\n" 3.14159 3.14159

格式控制#

宽度控制#

Terminal window
# 固定宽度输出
printf "%10s|%10s|%10s\n" "姓名" "年龄" "分数"
printf "%10s|%10d|%10.2f\n" "张三" 25 85.5
printf "%10s|%10d|%10.2f\n" "李四" 30 92.5
# 输出:
# 姓名| 年龄| 分数
# 张三| 25| 85.50
# 李四| 30| 92.50

对齐方式#

Terminal window
# 左对齐(使用-)
printf "%-10s|%-10s|%-10s\n" "姓名" "年龄" "分数"
printf "%-10s|%-10d|%-10.2f\n" "张三" 25 85.5
printf "%-10s|%-10d|%-10.2f\n" "李四" 30 92.5
# 输出:
# 姓名 |年龄 |分数
# 张三 |25 |85.50
# 李四 |30 |92.50

前导零#

Terminal window
# 数字前导零
printf "%05d\n" 123 # 输出:00123
printf "%010.2f\n" 3.14 # 输出:000003.1400

字符转义#

基本转义字符#

  • \\ - 反斜杠
  • \a - 警告字符(通常为响铃)
  • \b - 退格
  • \f - 换页
  • \n - 换行
  • \r - 回车
  • \t - 水平制表符
  • \v - 垂直制表符

八进制和十六进制转义#

  • \0NNN - 八进制值 NNN (1到3位数字) 表示的字符
    • 直接使用\NNN八进制数也可
  • \xHH - 十六进制值 HH (1到2位数字) 表示的字符

颜色转义#

我来详细介绍 Shell 中的颜色转义序列,这通常被称为 ANSI 转义码或 ANSI 颜色代码。

Shell 颜色转义基础#

在 Shell 中,颜色转义是通过 ANSI 转义序列实现的,基本格式为:

Terminal window
\033[<代码>m

Terminal window
\e[<代码>m

其中:

  • \033\e 表示 ESC (Escape) 字符
  • [ 是控制序列引导符
  • <代码> 是具体的颜色或样式代码
  • m 表示设置图形显示模式

基本颜色代码#

文本颜色#

  • 30 - 黑色
  • 31 - 红色
  • 32 - 绿色
  • 33 - 黄色
  • 34 - 蓝色
  • 35 - 洋红色
  • 36 - 青色
  • 37 - 白色

背景颜色#

  • 40 - 黑色背景
  • 41 - 红色背景
  • 42 - 绿色背景
  • 43 - 黄色背景
  • 44 - 蓝色背景
  • 45 - 洋红色背景
  • 46 - 青色背景
  • 47 - 白色背景

样式代码#

  • 0 - 重置所有样式
  • 1 - 粗体/加亮
  • 2 - 暗淡
  • 3 - 斜体
  • 4 - 下划线
  • 5 - 慢闪烁
  • 6 - 快闪烁
  • 7 - 反显(前景色和背景色交换)
  • 8 - 隐藏
  • 9 - 删除线

高级颜色(256色)#

标准16色的亮色版本#

  • 90 - 亮黑色
  • 91 - 亮红色
  • 92 - 亮绿色
  • 93 - 亮黄色
  • 94 - 亮蓝色
  • 95 - 亮洋红色
  • 96 - 亮青色
  • 97 - 亮白色

背景亮色#

  • 100 - 亮黑色背景
  • 101 - 亮红色背景
  • 102 - 亮绿色背景
  • 103 - 亮黄色背景
  • 104 - 亮蓝色背景
  • 105 - 亮洋红色背景
  • 106 - 亮青色背景
  • 107 - 亮白色背景

256色模式#

  • 38;5;<n> - 设置前景色为256色中的第n种颜色 (0-255)
  • 48;5;<n> - 设置背景色为256色中的第n种颜色 (0-255)

RGB真彩色#

  • 38;2;<r>;<g>;<b> - 设置前景色为RGB值
  • 48;2;<r>;<g>;<b> - 设置背景色为RGB值

实用示例#

#!/bin/bash
# 基本颜色示例
printf "\033[31m红色文本\033[0m\n"
printf "\033[32m绿色文本\033[0m\n"
printf "\033[33m黄色文本\033[0m\n"
printf "\033[34m蓝色文本\033[0m\n"
printf "\033[35m洋红色文本\033[0m\n"
printf "\033[36m青色文本\033[0m\n"
printf "\033[37m白色文本\033[0m\n"
# 背景颜色示例
printf "\033[41m红色背景\033[0m\n"
printf "\033[42m绿色背景\033[0m\n"
printf "\033[43m黄色背景\033[0m\n"
printf "\033[44m蓝色背景\033[0m\n"
printf "\033[45m洋红色背景\033[0m\n"
printf "\033[46m青色背景\033[0m\n"
printf "\033[47m白色背景\033[0m\n"
# 样式示例
printf "\033[1m粗体文本\033[0m\n"
printf "\033[4m下划线文本\033[0m\n"
printf "\033[7m反显文本\033[0m\n"
# 组合示例
printf "\033[1;31m粗体红色文本\033[0m\n"
printf "\033[4;33m下划线黄色文本\033[0m\n"
printf "\033[1;44;37m蓝底白字粗体文本\033[0m\n"
# 256色示例
for i in {0..255}; do
printf "\033[38;5;${i}m颜色%03d\033[0m " $i
if [ $((i % 16)) -eq 15 ]; then
printf "\n"
fi
done
# RGB真彩色示例
printf "\033[38;2;255;0;0m纯红色(RGB:255,0,0)\033[0m\n"
printf "\033[38;2;0;255;0m纯绿色(RGB:0,255,0)\033[0m\n"
printf "\033[38;2;0;0;255m纯蓝色(RGB:0,0,255)\033[0m\n"

实用技巧#

  1. 定义颜色变量
Terminal window
# 定义常用颜色变量
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 使用变量
printf "${RED}这是红色文本${NC}\n"
printf "${GREEN}这是绿色文本${NC}\n"
  1. 创建颜色函数
Terminal window
# 创建颜色输出函数
color_echo() {
local color=$1
local text=$2
case $color in
red) printf "\033[0;31m%s\033[0m\n" "$text" ;;
green) printf "\033[0;32m%s\033[0m\n" "$text" ;;
yellow) printf "\033[0;33m%s\033[0m\n" "$text" ;;
blue) printf "\033[0;34m%s\033[0m\n" "$text" ;;
*) printf "%s\n" "$text" ;;
esac
}
# 使用函数
color_echo red "这是红色文本"
color_echo green "这是绿色文本"
  1. 检测终端颜色支持
Terminal window
# 检测终端是否支持颜色
if [ -t 1 ]; then
ncolors=$(tput colors)
if [ -n "$ncolors" ] && [ "$ncolors" -ge 8 ]; then
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
fi
fi
printf "${RED}如果支持颜色,这将是红色${NC}\n"
  1. 在脚本中创建彩色表格
Terminal window
# 创建彩色表格
printf "+------------+------------+------------+\n"
printf "|\033[36m%-12s\033[0m|\033[36m%-12s\033[0m|\033[36m%-12s\033[0m|\n" "列1" "列2" "列3"
printf "+------------+------------+------------+\n"
printf "|\033[32m%-12s\033[0m|\033[33m%-12s\033[0m|\033[34m%-12s\033[0m|\n" "数据1" "数据2" "数据3"
printf "|\033[32m%-12s\033[0m|\033[33m%-12s\033[0m|\033[34m%-12s\033[0m|\n" "数据4" "数据5" "数据6"
printf "+------------+------------+------------+\n"

printf与echo的区别#

  1. 格式化能力

    • printf支持格式化字符串
    • echo只支持简单的文本输出
  2. 换行行为

    • printf默认不添加换行符
    • echo默认添加换行符
评论由 Giscus 提供支持

Shell printf
https://blog.erina.top/posts/shell_printf/
作者
Erina Yip
发布于
2025-10-03
许可协议
CC BY-NC-SA 4.0