Bash printf命令
通常,在编写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