在OSX High Sierra上,bash的printf
的行为似乎是错误的。考虑:
printf "[%s]" "x"
返回
[x]
一切都很好...但是:
printf "[%s]" "x" "y"
返回
[x] [y]
而不只是[x]!
不要告诉我:不要提供更多参数。我不知道传递给我的格式是什么样,但是我有参数
文档并不能直截了当地指出:
可以根据需要重复使用格式字符串,以满足参数的需要。 任何额外的格式规范都将使用零或空字符串进行评估。
这坏了吗?
答案 0 :(得分:3)
- 为了满足参数操作数,应根据需要经常重复使用格式操作数。
这恰好意味着格式字符串需要重复遍历所有参数的次数。这正是它的预期工作方式,这是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)