以不特定顺序打印 printf 的参数

以不特定顺序打印 printf 的参数

我如何以不特定的顺序引用coreutils 的参数?printf

这就是我想避免的:

$ printf '%s %s %s %s %s %s %s' a c a c b c a
a c a c b c a

这就是我想做的:

$ printf '%s %s³ %s¹ %s³ %s² %s³ %¹' a b c
a c a c b c a

这是用 Perl 实现的方法。

perl -e 'printf ("%s %3\$s %1\$s %3\$s %2\$s %3\$s %1\$s\n", 'a', 'b', 'c');'
a c a c b c a

请注意,只有四个参数传递给printf.

答案1

我找不到一种内置的方法来做到这一点。您始终可以在循环中生成参数,如下所示:

for循环

$ printf '[ -d %s ] || mkdir %s; cd %s\n' `for run in {1..3}; do echo "$dir";done`

略有差异:

$ printf '[ -d %s ] || mkdir %s; cd %s\n' $(for run in {1..3}; do echo "$dir";done)

您可以通过更改命令的这一部分来控制参数的数量{1..3}

序列和 xargs

$ printf '[ -d %s ] || mkdir %s; cd %s\n' $(seq 1 3 | { xargs -i -- echo "$dir"; })

这将创建一个 1 到 3 的数字序列,并控制 { xargs -i ... } 将执行的次数。

是的

感谢 @rici 的评论,您还可以使用此构造yes ... | head -n 3

$ printf '[ -d %s ] || mkdir %s; cd %s\n' $(yes "$dir" | head -n 3)

参考

答案2

bash 中的 Printf 没有实现该选项。

但一个简单的解决方案是使用变量:

$ a=a b=b c=c
$ printf '%s %s %s %s %s %s %s\n' "$a" "$c" "$a" "$c" "$b" "$c" "$a"
a c a c b c a

甚至是位置参数:

$ set -- a b c
$ printf '%s %s %s %s %s %s %s\n' "$1" "$3" "$1" "$3" "$2" "$3" "$1"
a c a c b c a

相关内容