bash printf{}中的变量替换

bash printf{}中的变量替换,bash,Bash,我试图使用var打印10次true,但它不起作用 count=10 printf 'true\n%.0s' {1..$count} 这项工作: printf 'true\n%.0s' {1..10} 我知道{}是在变量之前计算的,但我无法回避它。这不是printf的问题,而是{1..$count}的问题。这种扩展只能用常量来完成 for ((i=1; i<=10; i++)); do printf 'true\n%.0s' "$i" done 用于((i=1;i读取 解决此问题的

我试图使用var打印10次true,但它不起作用

count=10
printf 'true\n%.0s' {1..$count}
这项工作:

printf 'true\n%.0s' {1..10}

我知道
{}
是在变量之前计算的,但我无法回避它。

这不是
printf
的问题,而是
{1..$count}
的问题。这种扩展只能用常量来完成

for ((i=1; i<=10; i++)); do
  printf 'true\n%.0s' "$i"
done
用于((i=1;i读取

解决此问题的方法是:

printf 'true\n%.0s' $(eval echo "{1..$count}")
另一种方式(使用外部流程):


为了好玩,这里有一个稍微奇怪的方式:

mapfile -n $count a < /dev/urandom; printf 'true\n%.0s' ${!a[@]}
mapfile-n$count a
请参阅此处没有理由使用子shell;它只会增加效率低下。如果您想使用eval(请参阅我在@anubhava的回复中关于其安全影响的讨论)引用讨论中的一条评论,以防它随着答案的撤回而消失:如果有人在得到一个名为
/tmp/$(rm-rf/)的文件时,围绕扩展的
“$filename”
代码抛出一个
eval
bash-c
,我不想对此负责/您好
。太好了!!这确实有效,而且正是我想要的这绝对是安全的方法+1抱歉我可能不清楚..我知道使用for loop solns的方法,但正在寻找一种避免方法..通过使用类似eval的方法..@user3348409不要为了简洁而牺牲安全性。使用循环。
seq
两者都不是POSIX既没有指定bash内置,也没有在所有支持bash的操作系统上提供。也就是说,与其使用“eval”,不如减少子进程的开销并降低可移植性,因此这是对公认答案的改进;+1.,我想(哦——事实上,因为你是在迭代索引而不是值,是的,内容真的不重要,所以没有可能出现与所读内容相关的bug。那么,我无法解释为什么会有人投反对票;显然是一个没有幽默感的人)。
printf 'true\n%.0s' $(seq $count)
mapfile -n $count a < /dev/urandom; printf 'true\n%.0s' ${!a[@]}