我已经得到以下工作:

for i in {2..10}
do
    echo "output: $i"
done

它产生了一系列的输出行:2,输出:3,等等。

然而,试图运行以下程序:

max=10
for i in {2..$max}
do
    echo "$i"
done

产生以下结果:

output: {2..10}

我怎样才能让编译器意识到它应该把$max作为数组的另一端,而不是字符串的一部分?


当前回答

如果seq命令在您的系统上可用:

for i in `seq 2 $max`
do
  echo "output: $i"
done

如果不是,那么在perl中使用poor man's seq:

seq=`perl -e "\$,=' ';print 2..$max"`
for i in $seq
do
  echo "output: $i"
done

注意那些引号。

其他回答

这里它在Mac OS X上工作。

它包括一个BSD日期的例子,如何增加和减少日期:

for ((i=28; i>=6 ; i--));
do
    dat=`date -v-${i}d -j "+%Y%m%d"` 
    echo $dat
done

我们可以像C编程一样迭代循环。

#!/bin/bash
for ((i=1; i<=20; i=i+1))
do 
      echo $i
done

好吧,因为我没有在我的系统上安装seq命令(Mac OS X v10.6.1 (Snow Leopard)),我最终使用了while循环:

max=5
i=1

while [ $max -gt $i ]
do
    (stuff)
done

*耸耸肩*只要有用就行。

手动踩环:

i=0
max=10
while [ $i -lt $max ]
do
    echo "output: $i"
    true $(( i++ ))
done

如果你不需要完全POSIX,你可以使用算术for循环:

max=10
for (( i=0; i < max; i++ )); do echo "output: $i"; done

或者在BSD系统上使用jot(1):

for i in $( jot 0 10 ); do echo "output: $i"; done

Use:

max=10
for i in `eval echo {2..$max}`
do
    echo $i
done

你需要显式的“eval”调用来重新计算变量替换后的{}。