我已经得到以下工作:

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


当前回答

这是一种方式: Bash:

max=10
for i in $(bash -c "echo {2..${max}}"); do echo $i; done

当Bash -c分别被ksh -c或zsh -c取代时,上述Bash方式也适用于ksh和zsh。

注:对于i在{2..${max}};执行echo $i;在ZSH和ksh中做功。

其他回答

如果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

注意那些引号。

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

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

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

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

有不止一种方法。

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

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

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

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

这是一种方式: Bash:

max=10
for i in $(bash -c "echo {2..${max}}"); do echo $i; done

当Bash -c分别被ksh -c或zsh -c取代时,上述Bash方式也适用于ksh和zsh。

注:对于i在{2..${max}};执行echo $i;在ZSH和ksh中做功。