• 本页内容

47. printf


Bash 有一个格式化打印命令printf。 以下表是格式代码。

Format Description
%s 字符串
%d 数字
%x 十六进制
%o 八进制
%f 浮点数
%e 双精度
%c 单个字符
Number 最小字段宽度
- (hyphen) 左对齐
0 (zero) 数字用零填充
+ (plus) 打印 +- 符号
.number 精确的字段宽度
* 给出数字作为参数

在 bash printf内置函数中,"format" 是一个双引号字符串,混合了文字文本和格式标识符(由 "format" 修改),将被格式字符串后面的参数替换:

printf format arguments

以下示例在至少 5 个字符宽的字段中打印字符串。 当提供的字符串值少于 5 个字符时,bash 将添加前导空格:

$ printf "%5s\n" "123"
  123

当值超过 5 个字符宽时,它将打印完整的字符串:

$ printf "%5s\n" "123456"
123456

如果您想要精确的固定宽度,即使打印值包含更多字符,也请使用 . 和数字。 例如,%.5s将为您提供正好 5 个字符,并截断其余字符:

$ printf "%.5s\n" "123456"
12345

您还可以在printf格式修饰符中使用*,而不是在格式字符串中包含字段宽度或精度。 然后,您将修改数字作为参数传递。 下面两个例子结构是一样的

printf "%5s\n" "123"
printf "%*s\n" 5 "123"

使用 -(连字符)在值的右侧(而不是默认的左侧)填充空格。 这在打印具有多个字段的记录时非常有用。

$ printf "%-5s %s\n" "123" "ramesh"
123  ramesh

当您将 0 与数字格式标识符一起使用时,printf将在打印的数字中添加前导 0,而不是空格。 以下示例打印 "00123" 而不是 "123",因为我们已指定%05d作为标识符。

$ printf "%05d %s\n" "123" "ramesh"
00123 ramesh

在格式修饰符中使用 + 来打印数字及其符号。

$ printf "%+05d %-05d %s\n" 123 -90 "ramesh"
+0123 -90   ramesh

以上所有内容均在以下示例中显示。

$ cat printf.sh
echo -e "\n1. Print Fixed Width (space before):"
printf "%5s %s\n" "123" "ramesh"
printf "%5s %s\n" "1234" "john"
printf "%5s %s\n" "12345" "jason"
printf "%5s %s\n" "123456" "preeti"
echo -e "\n2. Print Exact Width (truncate characters):"
printf "%.5s\n" "123456"
echo -e "\n3. Print Fixed Width (using argument):"
printf "%*s\n" 5 "123"
echo -e "\n4. Print Fixed Width (space after):"
printf "%-5s %s\n" "123" "ramesh"
printf "%-5s %s\n" "1234" "john"
printf "%-5s %s\n" "12345" "jason"
echo -e "\n5. Print Numbers:"
printf "%20s %5d\n" "Decimal" 123
printf "%20s %+5d\n" "Decimal (with sign)" 123
printf "%20s %+5d\n" "Decimal (with sign)" -90
printf "%20s %5o\n" "Octal" 80
printf "%20s %5x\n" "Hexadecimal" 1298
echo -e "\n6. Print Fixed Width Numbers (zeros before):"
printf "%05d %s\n" "123" "ramesh"
printf "%05d %s\n" "1234" "john"
printf "%05d %s\n" "12345" "jason"