我已经得到以下工作:

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作为数组的另一端,而不是字符串的一部分?


当前回答

括号展开,{x..Y}在其他展开之前执行,因此不能将其用于可变长度序列。

相反,使用用户mob声明的seq 2 $max方法。

所以,在你的例子中,它会是:

max=10
for i in `seq 2 $max`
do
    echo "$i"
done

其他回答

括号展开,{x..Y}在其他展开之前执行,因此不能将其用于可变长度序列。

相反,使用用户mob声明的seq 2 $max方法。

所以,在你的例子中,它会是:

max=10
for i in `seq 2 $max`
do
    echo "$i"
done

这些都做{1..8},并且都应该是POSIX。他们也不会打破如果你 在循环中放入一个条件continue。规范的方式:

f=
while [ $((f+=1)) -le 8 ]
do
  echo $f
done

另一种方法:

g=
while
  g=${g}1
  [ ${#g} -le 8 ]
do
  echo ${#g}
done

另一个:

set --
while
  set $* .
  [ ${#} -le 8 ]
do
  echo ${#}
done

Use:

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

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

试试for的算术表达式版本:

max=10
for (( i=2; i <= $max; ++i ))
do
    echo "$i"
done

这在大多数bash版本中都可用,并且应该与Bourne shell (sh)兼容。

手动踩环:

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