首页 > 解决方案 > printf 返回多个副本

问题描述

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

printf "[%s]" "x"

返回

[X]

一切都很好......但是:

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

返回

[x][y]

而不仅仅是 [x] !!

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

文档没有直接解决这个问题,只是说明:

格式字符串会根据需要经常重复使用以满足参数。使用零或空字符串评估任何额外的格式规范。

这是坏了吗?

标签: bashmacosprintf

解决方案


posix 实用程序 printf

  1. 格式操作数应尽可能频繁地重用以满足参数操作数。

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

你想重复一个字符'#' 10 次?没有更简单的:

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[@]}"

推荐阅读