不在for循环中运行前评估变量

时间:2011-10-10 09:54:57

标签: bash random evaluation

在运行时之前是否有任何hack不在bash中评估变量?我有一种像这样的for循环: 问题是我把它放在回声中......否则这很有效!

for i in $(seq 0 100); do echo $(echo $RANDOM % 10 | bc); done

结果例如总是3 ...

5 个答案:

答案 0 :(得分:3)

除了你的问题:你的解决方案使用2个外部进程,1个管道,1个子进程进行一项简单的练习。 Pure Bash:

for (( CNTR=0; CNTR<=100; CNTR+=1 )); do
  echo  $((RANDOM%10))
done

答案 1 :(得分:0)

这适合我。

for i in $(seq 0 100);

do
    echo $RANDOM % 10 | bc
done

我看到......回声这对我有用:

for i in $(seq 0 100);

do
    echo "foo $(echo $RANDOM % 10 | bc)"
done

答案 2 :(得分:0)

或者,可以使用支撑扩展:

for i in {0..100}; do
  echo $((RANDOM%10))
done

答案 3 :(得分:0)

当您想要抢占变量插值时,传统的解决方案是使用引号和eval。这不像纯Bash解决方案那么优雅,但显然更便携。

 for i in $(seq 0 100); do
   eval 'echo $RANDOM % 10 | bc'
 done

这只是原始代码的最小重构,我发布它只是为了完整性。

答案 4 :(得分:-1)

你在这里遇到了一些问题,我认为其中任何一个都与变量评估无关。

首先,这里没有定义$RANDOM。也许你把它设置为3某处,这就是为什么你总是得到3作为输出?

第二个是你不需要那两个echo。省略外面的那个,以及围绕另一个的$()