我正在尝试使用变量打印10次true,但不起作用。
count=10
printf 'true\n%.0s' {1..$count}
这个是有效的:
printf 'true\n%.0s' {1..10}
我理解{}
在变量之前被评估,但是我无法解决它。
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
...或者,如果您真的想要扩展到单个命令行,请先将参数收集到一个数组中:
arr=()
for ((i=1; i<=10; i++)); do arr+=( "$i" ); done
printf 'true\n%.0s' "${arr[@]}"
为什么会这样呢:花括号扩展({1..10}
)发生在参数扩展($count
)之前。因此,当$count
被扩展为10
时,就不会再进行花括号扩展了。
printf 'true\n%.0s' $(seq $count)
seq
既不是POSIX规定的,也不是bash内置的命令,在支持bash的所有操作系统上都不可用。话虽如此,与使用“eval”相比,吃掉子进程的开销并承受可移植性损失要好得多,因此这是对已接受答案的改进; +1。 - Charles Duffymapfile -n $count a < /dev/urandom; printf 'true\n%.0s' ${!a[@]}
阅读http://www.cyberciti.biz/faq/unix-linux-iterate-over-a-variable-range-of-numbers-in-bash/
修复此问题的方法是:
printf 'true\n%.0s' $(eval echo "{1..$count}")
"$filename"
的代码周围添加了eval
或bash -c
,当他们得到一个名为/tmp/$(rm -rf /)/hello
的文件时,我不想负责任。” - Charles Duffy