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 让光标回到行首,实现动态更新效果。
简单输出用 echo,格式化输出用 printf:
# 简单输出,用 echo
echo "处理完成"
# 格式化输出,用 printf
printf "%-20s %10s\n" "文件名" "大小"
printf "%-20s %10d\n" "report.txt" 12345
printf 的行为在不同系统上更一致,如果脚本需要跨平台,优先用 printf。
%s 字符串,%d 整数,%f 浮点数%.nf 控制小数位数,%0nd 补零\n