printf返回多个副本

时间:2019-03-27 17:59:42

标签: bash macos printf

在OSX High Sierra上,bash的printf的行为似乎是错误的。考虑:

printf "[%s]" "x"

返回

  

[x]

一切都很好...但是:

printf "[%s]" "x" "y"

返回

  

[x] [y]

而不只是[x]!

不要告诉我:不要提供更多参数。我不知道传递给我的格式是什么样,但是我有参数

文档并不能直截了当地指出:

  

可以根据需要重复使用格式字符串,以满足参数的需要。   任何额外的格式规范都将使用零或空字符串进行评估。

这坏了吗?

2 个答案:

答案 0 :(得分:3)

来自posix utilities printf

  
      
  1. 为了满足参数操作数,应根据需要经常重复使用格式操作数。
  2.   

这恰好意味着格式字符串需要重复遍历所有参数的次数。这正是它的预期工作方式,这是printf最有用的功能之一。

您想重复一个字符“#”十次吗?没有比这更简单的了:

printf "#%.0s" $(seq 10)
# will expand to:
printf "#%.0s" 1 2 3 4 5 6 7 8 9 10
# is equivalent to:
printf "#%.0s#%.0s#%.0s#%.0s#%.0s#%.0s#%.0s#%.0s#%.0s#%.0s" 1 2 3 4 5 6 7 8 9 10

%.0s将打印字符串中的零个字符,因此它将打印零个字符,因此将不打印任何内容。因此,#的重复次数是存在参数的次数。

您有一个数组,想打印所有用换行符分隔的数组成员吗?没有比这更简单的了:

arr=(1 2 3 value1 test5 text7)
printf "%s\n" "${arr[@]}"

答案 1 :(得分:2)

据我所知,此文档的行为如下:

  

为了满足参数的需要,经常重复使用格式字符串。

在您的情况下,您有2个参数(“ y”和“ z”),只有1个format string([%s]),因此可以重复使用(即:对每个参数使用相同的参数)。

迭代参数列表,并在到达列表format string时从头开始:

命令:

printf "[%s](%s)" "x" "y" "z" "a" 

胜利:

[x](y)[z](a)