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"