Bash printf命令

时间:2020-03-05 15:31:38  来源:igfitidea点击:

通常,在编写bash脚本时,我们使用echo打印到标准输出。
echo是一个简单的命令,但其功能有限。
要更好地控制输出的格式,请使用printf命令。

printf命令格式化并打印其参数,类似于C printf()函数。

printf命令

printf是Bash和其他流行shell(如Zsh和Ksh)中的shell内置程序。
还有一个独立的/usr/bin/printf二进制文件,但是shell内置版本优先。
我们将介绍printf的Bash内置版本。

printf命令的语法如下:

printf [-v var] format [arguments]

v选项告诉printf不要打印输出,而是将其分配给变量。

格式是一个字符串,可以包含三种不同类型的对象:

  • 只是按原样打印到输出的普通字符。

  • 反斜杠转义字符,被解释并打印。

  • 描述格式的转换规范,由格式字符串后面的各个参数的值替换。

该命令接受任意数量的参数。
如果提供的参数多于格式说明符,则会重用格式字符串以使用所有参数。
如果提供的参数少于格式说明符,则另外的数值格式说明符将设置为零值,而字符串格式说明符则设置为空字符串。

以下是传递printf命令参数时要考虑的几点:

  • 在将参数传递给printf命令之前,shell将替换所有变量、通配符匹配和特殊字符。

  • 使用单引号""时,将保留引号内每个字符的文字值。
    不会展开变量和命令。

使用printf的典型示例如下:

printf "Open issues: %s\nClosed issues: %s\n" "34" "65"
Open issues: 34
Closed issues: 65

字符串Open issues:%s\n closed issues:%s\n是格式,而"34"和"65"是参数。
格式字符串包含两个换行符(\n)和两个用参数替换的格式说明符(%s)。

printf命令不会在行尾添加换行符(\n)。

反斜杠转义字符

反斜杠转义字符在格式字符串或者与%b转换说明符对应的参数中使用时会被解释。
以下是最常见的转义字符列表:

  • -显示反斜杠字符。

  • \b-显示退格字符。

  • \n-显示新行。

  • \r-显示回车。

  • \t-显示水平制表符。

  • \v-显示垂直制表符。

转换格式

转换规范采用以下形式:

%[flags][width][.precision]specifier

每个转换规范都以百分号(%)开头,包括可选修饰符,并以以下字母之一结尾,这些字母表示相应参数的数据类型(说明符):aAbcdeEfgGioqsuxX。
转换类型说明符

类型转换说明符是指定如何解释相应参数的字符。
此字符是必需的,它位于可选字段之后。

下面列出了所有类型转换及其作用:

  • %b-在展开反斜杠转义序列时打印参数。

  • %打印shell引用的参数,可作为输入重用。

  • %d、 %i-将参数打印为带符号的十进制整数。

  • %u-将参数打印为无符号十进制整数。

  • %o-将参数打印为无符号八进制整数。

  • %x、 %X-将参数打印为无符号十六进制整数。
    %x打印小写字母,%X打印大写字母。

  • %e、 %E-以指数表示法将参数打印为浮点数。
    %e打印小写字母,%E打印大写字母。

  • %a、 %A-以十六进制小数表示法将参数打印为浮点数。
    %a打印小写字母,%A打印大写字母。

  • %g、 %G-以普通或者指数表示法将参数打印为浮点数,以更适合给定值和精度的值为准。
    %g打印小写字母,%G打印大写字母。

  • %c-将参数打印为单个字符。

  • %f-将参数打印为浮点数。

  • %s-将参数打印为字符串。

  • %%-打印文字%符号。

无符号数字表示零和正数,而有符号数字表示负数、零和正数。

以下命令在三种不同的数字系统中打印数字100:

printf "Decimal: %d\nHex: %x\nOctal: %o\n" 100 100 100
Decimal: 100
Hex: 64
Octal: 144

Flags指令

标志是第一个可选修饰符,用于设置对正、前导零、前缀等。

以下是最常见的:

  • --在字段内左对齐打印文本。
    默认情况下,文本右对齐。

  • +-在数字前面加上+或者-号。
    默认情况下,只有负数的前缀是负号。

  • 0-用前导零代替空格填充数字。

  • 空白-在正数前面加空格,负数加负号(-)。

  • #-数字的另一种格式。

宽度指令width

width指令字段放在任何标志字符之后,并指定转换应产生的最小字符数。

如果输出的文本宽度小于指定的宽度,则用空格填充。
宽度可以指定为非负十进制整数或者星号(*)。

下面是一个例子:

printf "%20s %d\n" Mark 305

%20s表示设置字段长度至少为20个字符。
在文本之前添加空格,因为默认情况下,输出是右对齐的。
要将文本左对齐,请使用-标志(%-20s)。

Mark 305

当星号(*)用作width指令时,转换字段的宽度由正在格式化的参数之前的width参数设置。

在下面的示例中,我们将宽度设置为10:

printf "%0*d" 10 5

0是一个标志,它用前导零代替空格填充数字。
输出文本至少有10个字符:

0000000005

精度指令

.precision修饰符由一个点(.)后跟一个正整数或者星号(*)组成,根据说明符类型,该修饰符设置要打印的字符串或者数字字符数或者小数位数。

精度具有以下效果:

  • 如果转换类型为整数,则精度指定要打印的最小位数。
    如果参数中的位数小于精度,则打印前导零。

  • 如果转换类型是浮点,则精度指定小数点字符后面的位数。
    默认精度为6。

  • 如果转换类型是字符串,则精度指定要打印的最大字符数。
    如果参数中的字符数大于精度,则会截断多余的字符。

下面是一个示例,演示如何将浮点数舍入为3位小数:

printf "%.3f" 1.61803398
1.618

当precision设置为星号(*)时,其值由正在格式化的参数之前的precision参数设置。

printf "%.*f" 3 1.61803398
1.618