printf 格式化

printf 命令来自 C 语言,提供强大的格式化输出功能。相比 echo,它能精确控制输出格式,适合生成报表、对齐数据等场景。

基本语法

printf "格式字符串" 参数1 参数2 ...

格式字符串中的普通字符原样输出,格式说明符会被对应的参数替换:

printf "姓名:%s,年龄:%d\n" "张三" 25

运行结果:

姓名:张三,年龄:25

注意 printf 不会自动加换行,需要手动加 \n

格式说明符

常用的格式说明符:

说明符含义示例
%s字符串"hello"
%d十进制整数123
%f浮点数3.14
%x十六进制(小写)ff
%X十六进制(大写)FF
%o八进制377
%c单个字符A
%%百分号本身%
printf "字符串:%s\n" "测试"
printf "整数:%d\n" 100
printf "浮点数:%f\n" 3.14159
printf "十六进制:%x\n" 255

运行结果:

字符串:测试
整数:100
浮点数:3.141590
十六进制:ff

宽度和对齐

指定输出宽度,默认右对齐:

printf "|%10s|\n" "hello"
printf "|%10d|\n" 123

运行结果:

|     hello|
|       123|

%10s 表示宽度为 10 个字符,不足的用空格填充。

左对齐用负号:

printf "|%-10s|\n" "hello"
printf "|%-10d|\n" 123

运行结果:

|hello     |
|123       |

精度控制

浮点数可以指定小数位数:

printf "%.2f\n" 3.14159
printf "%.4f\n" 3.14159
printf "%8.2f\n" 3.14159

运行结果:

3.14
3.1416
    3.14

%8.2f 表示总宽度 8,保留 2 位小数。

字符串也可以限制长度:

printf "%.3s\n" "hello world"

运行结果:

hel

只输出前 3 个字符。

前导零

数字前面补零:

printf "%05d\n" 42
printf "%08d\n" 123

运行结果:

00042
00000123

实用示例

生成表格

printf "%-10s %-8s %5s\n" "姓名" "部门" "工资"
printf "%-10s %-8s %5d\n" "张三" "技术部" 8000
printf "%-10s %-8s %5d\n" "李四" "销售部" 7500
printf "%-10s %-8s %5d\n" "王五" "财务部" 6000

运行结果:

姓名       部门       工资
张三       技术部     8000
李四       销售部     7500
王五       财务部     6000

格式化日期时间

year=2024
month=3
day=15
printf "日期:%04d-%02d-%02d\n" $year $month $day

运行结果:

日期:2024-03-15

进度条

for i in {1..10}; do
    printf "\r进度:[%-10s] %d%%" "$(printf '#%.0s' $(seq 1 $i))" $((i * 10))
    sleep 0.2
done
printf "\n完成!\n"

\r 让光标回到行首,实现动态更新效果。

printf 和 echo 的选择

简单输出用 echo,格式化输出用 printf:

# 简单输出,用 echo
echo "处理完成"

# 格式化输出,用 printf
printf "%-20s %10s\n" "文件名" "大小"
printf "%-20s %10d\n" "report.txt" 12345

printf 的行为在不同系统上更一致,如果脚本需要跨平台,优先用 printf。

小结

  • printf 提供强大的格式化输出功能
  • %s 字符串,%d 整数,%f 浮点数
  • 宽度用数字指定,负号左对齐
  • %.nf 控制小数位数,%0nd 补零
  • printf 不会自动换行,需要手动加 \n