Bash 脚本 – Printf 命令用示例解释

在这篇文章中,我将解释 重击打印 命令与 Linux 中的示例。 在本文结束时,您将熟悉在 Bash shell 脚本中使用 printf 命令。

bash printf 命令

重击 提供两种类型的命令,可用于将输出打印到终端。 一个是 回声 主要用于此目的的命令。 第二个是 打印 命令。

Printf 类似于 打印函数C 语言,但有自己的一套功能。 之间的主要区别 echoprintf 命令是 printfecho 命令。

如果您还没有使用过 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不带参数的 Printf

传递一个参数并运行 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带有换行符的 Printf

变量和命令解释

您可以将任何变量或运行命令包含在 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 语句多行 printf 语句

反斜杠转义字符

您可以在中使用以下反斜杠转义字符 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 初学者教程