在这篇文章中,我将解释 重击打印 命令与 Linux 中的示例。 在本文结束时,您将熟悉在 Bash shell 脚本中使用 printf 命令。
bash printf 命令
重击 提供两种类型的命令,可用于将输出打印到终端。 一个是 回声 主要用于此目的的命令。 第二个是 打印 命令。
Printf
类似于 打印函数 在 C 语言,但有自己的一套功能。 之间的主要区别 echo
和 printf
命令是 printf
与 echo
命令。
如果您还没有使用过 echo
命令之前,我们有一篇关于它的详细文章,你应该看看。
- 用 Linux 中的示例解释 Bash Echo 命令
Printf
是一个内置的shell,但你也可以找到外部命令 printf
. 内置命令优先于外部命令。 您可以通过运行 type
命令如下图。
$ type -a printf printf is a shell builtin printf is /usr/bin/printf printf is /bin/printf
有关更多详细信息 type
命令,请参阅以下指南:
- 带有初学者示例的类型命令教程
如果你想运行外部版本 printf
,您必须指向二进制文件所在的完整目录路径。
$ printf "Hello Worldn" # SHELL BUILTIN
$ /usr/bin/printf "Hello Worldn" # EXTERNAL VERSION OF PRINTF
显示 Bash printf 帮助
正如我在上一节中提到的, printf
是 bash 内置。 你必须打开 bash
手册页并导航到 printf
部分。
$ man bash
/printf → presss
您还可以运行以下命令,该命令将显示 printf
来自 bash
手册页。
$男人 bash | 少 --pattern='^ *printf +['
Basic form of printf command
Throughout the examples, I will compare the printf
with echo
command to understand the commonality.
Below is the format for the printf
command:
printf [-v var] 格式 [arguments]
参数应该传递给 printf
否则它将失败,如下图所示。
$ printf
$ echo $?

传递一个参数并运行 printf
再次命令。 从下面 example 你可以看到我添加了 n 这是换行符。 默认情况下, printf
不会像 echo
命令,所以你必须添加 n
.
$ printf "Linux is fun to work with" # WITHOUT NEW LINE
$ printf "Linux is fun to work withn" # WITH NEW LINE

变量和命令解释
您可以将任何变量或运行命令包含在 printf
陈述。 这种行为类似于 echo
命令。
$ VAR1="Linux"
$ printf "$VAR1 is fun to work withn"

建议阅读:
- Bash 脚本——用例子解释的变量
单引号和双引号行为
当您用单引号将参数括起来时,变量和命令将被视为纯文本。 这是相同的行为 echo
命令也。 如果要扩展变量和命令,则必须用双引号将参数括起来。
$ printf '$VAR1 is fun to work withn'
$ printf 'Today date = $(date)n'

当你传递不带引号的参数时, printf
将只考虑第一个单词作为参数并打印它。 所以使用引号 printf
是必要的。
$ printf Today date = $(date)n

重定向和管道输出
默认情况下, printf
将输出发送到标准输出(终端)。 您可以使用 重定向运算符 或将其与 管道操作员 用于进一步处理。
# PRINT TO STDOUT $ printf "Today date = $(date)n"
# REDIRECT TO A FILE $ printf "Today date = $(date)n" > /tmp/tdy.txt $ cat /tmp/tdy.txt
# PIPE $ printf "Today date = $(date)n" | grep -i -o IST

相关阅读:
- 用示例解释 Bash 重定向
将输出分配给变量
有时您可能希望存储 printf
输出到一个变量并稍后将其用于某些处理。 通常你会运行 printf
用括号括起来,它将运行命令并将输出分配给变量。
$ ZONE=$(printf "Today date = $(date)n" | grep -i -o IST)
$ printf $ZONE

或者,您可以使用 -v
旗连同 printf
将输出存储到变量中。 您必须在之后传递变量名 -v
旗帜。
$ printf -v TIME "Today date = $(date)n" $ echo $TIME

多行 printf 语句
如果要打印多行,则可以将文本用双引号引起来。 同样,如果您有一个大行要打印为单行,并且希望以多行形式编写该行以获得更好的代码可读性,则可以在每行末尾使用反斜杠,下一行将被视为继续上一行。
$ printf "n I am running PoP_OS
It is a great OS
With Great featuresn"
$ printf "I am running pop_os
It is a great OS
With Great featuresn"

反斜杠转义字符
您可以在中使用以下反斜杠转义字符 printf
.
- 换行符 (n)
- 水平制表符 (t) 和垂直制表符 (v)
- 退格字符 (b)
- 回车 (r)
让我们通过例子一一讨论。
换行符 (n)
我们已经看到了换行符(n
) 在所有前面的部分中。 换行符 (n
) 将添加一个新行。
$ printf "Today date = $(date)n"

水平制表符 (t) 和垂直制表符 (v)
水平和垂直制表符用于将制表符空格添加到您的 printf
论据。
$ printf "Today date t $(date)n" # HORIZONTAL TAB
$ printf "Today date v $(date)n" # VERTICAL TAB

退格字符 (b)
退格字符 (b
) 将删除一个字母。 这就像从我们的键盘上按 Backspace 键。
$ printf "It's a rainby day..n"

回车 (r)
回车时光标回到第一个位置 (r
) 用来。 不管后面发生什么 r
将从第一个位置替换字符。
$ printf "It's a rainbyr day..n"

转义反斜杠字符 ()
如果您想转义特殊字符 (n
, t
, v
, b
, r
) 并将其视为字符串,然后在其前面加上双反斜杠 ()。
$ printf "It's a rainbyr day..n"

到目前为止,无论您看到什么,都可以在 echo
命令也。 如果你已经知道 echo
命令,到这个时候你会很适应 printf
命令也。
Printf 格式说明符
格式说明符是一种替换值的方法 printf
而不是硬编码值 printf
. 有许多用于替换的字母,每个字母代表一种特定的数据类型。 使用说明符时,您必须为其添加前缀 %
象征。 让我们看看一些常用的格式说明符。
字符串说明符 (%s)
如果你想在里面放置任何字符串 printf
,你必须使用 %s
. 看看下面 example. 我有一个 printf
声明,我想替换值 “团结的” 在 – 的里面 printf
. 所以 %s
使用它是一个字符串说明符,当您运行命令时,该值 “联合的” 将被取代 %s
.
$ printf "++ Manchester %s has a strong lineup this season" "United"

您可以根据需要传递任意数量的替换参数,并且您必须在参数中使用相同数量的说明符。
$ printf "++ %s %s has a strong lineup this %s" "Manchester" "United" "season"

如果使用更少的说明符和更多的参数怎么办?
看看下面 example. 我在一开始只使用了一个说明符,并传递了三个要替换的参数(字符串)。 道路 printf
对待这是,它将开始替换第一个说明符中的第一个参数,并且下一个参数将再次传递给第一个说明符,因为没有其他说明符。 这样,将发生三个实际上不正确的替换以及我们想要的结果。
$ printf "++ %s United has a strong lineup this Seasonn" "Manchester" "United" "season"

在某些用例中,这种行为是有意义的。 看看下面 example. 我希望为一些玩家打印欢迎信息,并将他们的名字作为参数传递。 通常,您可以将名称列表存储在数组中并循环遍历数组并打印消息。 但这是通过避免使用循环来实现结果的有效方法。
$ printf "++ Welcome %s to manchester unitedn" "Ronaldo" "Varane" "Jadon Sanchon" ++ Welcome Ronaldo to manchester united ++ Welcome Varane to manchester united ++ Welcome Jadon Sancho to manchester united

有符号十进制整数 (%d) 和无符号十进制整数 (%u)
要替换单数整数,请使用 %d
.
$ printf ">> Welcome %s to manchester united - You get shirt number - %dn" "Ronaldo" 7 "Varane" 19 "Jadon Sancho" 25

要替换无符号整数,请使用 %u
.
$ printf "UNSIGNED INTEGER = %un" 10

如果您尝试替换整数以外的任何数据类型,您将收到错误消息。
$ printf ">> Ronaldo gets no %dn" seven

浮点数 (%f)
要替换浮点数,请使用 %f
.
$ printf "Integer 100 to floating-point %fn" 100

解释反斜杠转义序列
您可以将反斜杠转义序列作为参数传递并使用 %b
这将解释和扩展反斜杠转义序列。
$ printf "Welcome to %b Manchester united %b" "v" "n"

Printf 转换指令
有可选的转换修饰符可用于格式化您的 printf
输出。
%[flags][width][.precision]specifier
宽度修饰符
宽度修饰符决定了转换中的最小字符数。 如果字符数较少,则空格将作为前缀,如下所示。
$ printf "%10sn" "Ronaldo"

如果你看一下上面的图片,说明符(罗纳尔多)是 7 字符,我已指定宽度为 10. 在这种情况下,它将添加空格来证明宽度 10.
您还可以使用标志修饰符来证明对齐或添加零而不是空格。 为了 example如果输出需要左对齐,则可以添加连字符 (-
) 标志修饰符。
$ printf "%-10sn" "Ronaldo"

在整数和浮点值的情况下,您可以将空格替换为 零 通过添加零 (0) 标志修饰符。
$ printf "%010d n" 7

精密改性剂
这是一个可选参数,可用于决定要打印的字符串、整数和浮点位置的数量。 你必须使用 点(。) 后跟整数来决定要打印的位置数。
看看下面 example. 我正在使用字符串说明符并将精度修饰符设置为四。
$ printf "%.7sn" "Ronaldo has joined Manu"

星号 (*
) 可以传递而不是精度整数值。 星号将接受精度参数,而不是对精度值进行硬编码。
$ printf "%.*sn" 7 "Ronaldo has joined Manu"

结论
我们在本文中介绍了很多关于 Bash printf 命令的信息。 要使用 printf
舒适地,只需练习文章中给出的所有示例。 Printf 在格式化方面比我在本文中展示的示例强大得多。 如果您对基础知识感到满意,则取决于您可以使用的用例 printf
有效率的。
相关阅读:
- Bash 脚本——用示例解释索引数组
- Bash 脚本——用示例解释的关联数组
- Bash 脚本 – While 和 until 循环用示例解释
- Bash 脚本——用例子解释 For 循环
- Bash 脚本——用例子解释的函数
- Bash Heredoc 初学者教程