1. 简介与语法
printf 是 Linux 下强大的格式化输出命令,功能与 C 语言的 printf() 函数类似,能精确控制文本、数字的显示格式。
基本语法:
bash
printf FORMAT [ARGUMENT]...
FORMAT 即格式字符串,控制输出样式;ARGUMENT 是被格式化的数据。printf 默认不会在输出末尾自动添加换行符。
主要优势:
- 精确控制输出格式 :宽度、精度、对齐、数据类型转换等;
- 处理多种数据类型 :整数、浮点数、字符串、特殊字符等;
- 比 echo 更灵活可靠 :尤其适合脚本开发、生成报告或日志。
2. 格式化说明符
| 说明符 | 描述 | 示例(输出) |
|---|---|---|
| %s | 字符串 | printf "%s\n" "Hello" → Hello |
| %d, %i | 十进制整数 | printf "%d\n" 42 → 42 |
| %f | 浮点数 | printf "%f\n" 3.14159 → 3.141590 |
| %.2f | 浮点数(两位小数) | printf "%.2f\n" 3.14159 → 3.14 |
| %e, %E | 科学计数法 | printf "%e\n" 1000 → 1.000000e+03 |
| %x, %X | 十六进制整数 | printf "%x\n" 255 → ff |
| %o | 八进制整数 | printf "%o\n" 8 → 10 |
| %c | 单个字符 | printf "%c\n" "ABC" → A |
| %% | 输出百分号 % | printf "%%\n" → % |
| %b | 对参数中的转义字符进行解析 | printf "%b\n" "Hello\nWorld" |
%b 会将参数中的 \n、\t 等转义字符进行解析,而普通的 %s 则不会。
3. 转义字符
| 转义序列 | 含义 | 说明 |
|---|---|---|
| \n | 换行符 | 将光标移至下一行开头 |
| \r | 回车符 | 将光标移至当前行开头 |
| \t | 水平制表符 | 用于对齐文本 |
| \v | 垂直制表符 | 将光标移至下一行(同列) |
| \b | 退格符 | 删除前一个字符 |
| \a | 报警符 | 触发系统的报警声 |
| \ | 反斜杠 | 输出 \ 本身 |
| " | 双引号 | 输出 " 本身 |
| \f | 换页符 | 将光标移至下一页开头 |
| \e | Escape 字符 | ASCII 码 27(ESC) |
| \c | 强制结束输出 | 后续内容不再输出 |
| \0NNN | 八进制字节 | 由 1 至 3 位八进制数表示 |
| \xHH | 十六进制字节 | 由 1 至 2 位十六进制数表示 |
| \uHHHH | Unicode 字符 | 4 位十六进制值 |
| \UHHHHHHHH | Unicode 字符 | 8 位十六进制值 |
这些转义序列均直接应用于 FORMAT 字符串中。
4. 格式修饰符
除了基本的说明符,还可以添加修饰符以更精细地控制输出:
| 修饰符 | 作用 | 示例 |
|---|---|---|
| 宽度 | 在说明符中指定最小字符宽度 | %10s → 宽度至少 10 个字符,右对齐 |
| - | 左对齐(默认右对齐) | %-10s → 宽度 10,左对齐 |
| 精度 | 控制字符串最大长度或小数位数 | %.2f → 保留两位小数 %.5s → 最多输出 5 个字符 |
| 组合 | 同时指定宽度和精度 | %8.2f → 总宽 8,保留 2 位小数 |
| 0 | 用 0 填充空白(仅对数值有效) | %05d → 数字宽度至少 5 位,不足补 0 |
| * | 从参数中动态获取宽度和精度 | %*.*f → 宽度和精度由参数提供 |
这些修饰符为创建对齐表格、控制数值显示等复杂输出提供了极大的灵活性。
5. 常用选项
| 选项 | 功能描述 |
|---|---|
| -v VAR | 将格式化后的输出赋值给变量 VAR,而非打印到屏幕 |
| --help | 显示帮助信息并退出 |
| --version | 显示版本信息并退出 |
-v 选项在脚本中非常实用,可将格式化的文本存入变量,供后续使用。
6. 实用示例
① 基本输出
bash
printf "Hello, %s!\n" "World"
输出:Hello, World!
② 格式化字符串(表格对齐)
bash
printf "%-10s %-8s %-4s\n" "姓名" "性别" "体重(kg)"
printf "%-10s %-8s %-4.2f\n" "杨过" "男" 68.6543
输出:
| 姓名 | 性别 | 体重(kg) |
|---|---|---|
| 杨过 | 男 | 68.65 |
%-10s 表示宽度至少 10 且左对齐,%-4.2f 表示总宽至少 4、小数部分取 2 位。