![以不特定顺序打印 printf 的参数](https://linux22.com/image/49023/%E4%BB%A5%E4%B8%8D%E7%89%B9%E5%AE%9A%E9%A1%BA%E5%BA%8F%E6%89%93%E5%8D%B0%20printf%20%E7%9A%84%E5%8F%82%E6%95%B0.png)
我如何以不特定的顺序引用coreutil
s 的参数?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