Shell浅浅谈(八)探索printf命令的格式化魅力

发布于:2024-12-18 ⋅ 阅读:(119) ⋅ 点赞:(0)

Shell 中的 printf 命令学习笔记

本文章给大家介绍一个echo以外的常用输出命令:printfprintf 具有比 echo 更强大的格式控制能力,能够更精确地控制输出格式,适合用来编写移植性更强的脚本。

1. printf 命令简介

printf 命令模仿 C 语言库中的 printf() 函数,能够按照指定格式输出文本。它的输出格式非常灵活,支持控制输出内容的对齐、宽度、精度等,且不自动添加换行符。

语法
printf format-string [arguments...]
  • format-string:格式字符串,可以包含文本和格式说明符。
  • arguments:填充格式说明符的参数列表。
常见格式说明符
格式说明符 说明
%s 输出字符串
%d 输出十进制整数
%f 输出浮点数
%c 输出单个字符
%x 输出十六进制数
%o 输出八进制数
%b 输出二进制数
%e 输出科学计数法的浮点数

2. 基本示例

  1. 简单输出
$ echo "Hello, Shell"
Hello, Shell

$ printf "Hello, Shell\n"
Hello, Shell

输出与 echo 相同,但 printf 更灵活,不会自动添加换行符,必须显式添加 \n

  1. 格式化输出
#!/bin/bash
# 使用 printf 进行格式化输出

printf "%-10s %-8s %-4s\n" 姓名 性别 年龄
printf "%-10s %-8s %-4.2f\n" 眨眼睛 男 38

# 输出:
: '
姓名     性别   年龄
眨眼睛  男      38.00
'
  • %-10s 表示输出一个宽度为 10 的字符串,- 表示左对齐,不足 10 个字符会用空格填充。
  • %-4.2f 表示格式化浮点数,保留 2 位小数。

3. 参数替代和格式重复使用

可以一次性传递多个参数,printf 会根据格式字符串重复使用格式说明符。

# 格式字符串和参数的数量不一定要匹配
printf "%s %d\n" "abc" 1    # 输出: abc 1
printf "%s %s %s\n" a b c d e f g h i j
# 输出:
# a b c
# d e f
# g h i
# j

4. 默认值

如果没有提供参数,printf 会使用默认值代替:

# 没有提供参数,%s 使用 NULL,%d 使用 0
printf "%s and %d \n"
# 输出: " and 0"

5. 转义序列

printf 支持许多转义字符,可以在输出中插入特殊字符。

转义序列 说明
\a 警告字符 (ASCII BEL)
\b 后退字符 (Backspace)
\c 抑制输出(不显示换行符)
\f 换页符 (Form Feed)
\n 换行符
\r 回车符 (Carriage Return)
\t 水平制表符 (Tab)
\v 垂直制表符 (Vertical Tab)
\\ 反斜杠 (\)
\ddd 八进制字符,1 到 3 位数字
\0ddd 八进制字符(带有前导零)
示例:使用转义序列
# 普通输出
printf "a string:<%s>\n" "A\nB"
# 输出: a string:<A\nB>

# 使用 %b 格式说明符,进行转义处理
printf "a string:<%b>\n" "A\nB"
# 输出: a string:<A
# B>

# 输出警告字符
printf "https://szcyyds.blog.csdn.net/ \a"
# 输出: https://szcyyds.blog.csdn.net/(终端会发出警告声音)

6. 自定义示例

假设你需要打印一个列表,包含不同类型的数据。可以使用 printf 来进行格式化输出:

#!/bin/bash
# 自定义格式输出

name="Alice"
age=30
salary=75000.50
is_active="Yes"

# 输出一行格式化数据
printf "Name: %-10s Age: %-3d Salary: $%-10.2f Active: %-5s\n" "$name" "$age" "$salary" "$is_active"

输出

Name: Alice      Age: 30  Salary: $75000.50 Active: Yes  

网站公告

今日签到

点亮在社区的每一天
去签到