bash printf {}中的变量替换

时间:2014-02-24 20:45:27

标签: bash

我正在尝试使用var打印真实10次,而不能正常工作

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

这有效:

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

我知道在{vars}之前会对{}进行评估,但我无法绕过它。

4 个答案:

答案 0 :(得分:11)

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

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

...或者,如果你真的想扩展到一个命令行,首先将你的参数收集到一个数组中:

arr=()
for ((i=1; i<=10; i++)); do arr+=( "$i" ); done
printf 'true\n%.0s' "${arr[@]}"

解释原因:支持扩展({1..10})在参数扩展($count)之前发生。因此,当$count扩展到10时,不会再发生支撑扩展。

答案 1 :(得分:2)

另一种方式(使用外部流程):

printf 'true\n%.0s' $(seq $count)

答案 2 :(得分:0)

为了它的乐趣,这里有一个奇怪的方式:

mapfile -n $count a < /dev/urandom; printf 'true\n%.0s' ${!a[@]}

答案 3 :(得分:-2)

阅读http://www.cyberciti.biz/faq/unix-linux-iterate-over-a-variable-range-of-numbers-in-bash/

解决这个问题的方法是:

printf 'true\n%.0s' $(eval echo "{1..$count}")