我已经得到以下工作:
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作为数组的另一端,而不是字符串的一部分?
我已经得到以下工作:
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作为数组的另一端,而不是字符串的一部分?
当前回答
手动踩环:
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
其他回答
好吧,因为我没有在我的系统上安装seq命令(Mac OS X v10.6.1 (Snow Leopard)),我最终使用了while循环:
max=5
i=1
while [ $max -gt $i ]
do
(stuff)
done
*耸耸肩*只要有用就行。
括号展开,{x..Y}在其他展开之前执行,因此不能将其用于可变长度序列。
相反,使用用户mob声明的seq 2 $max方法。
所以,在你的例子中,它会是:
max=10
for i in `seq 2 $max`
do
echo "$i"
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”调用来重新计算变量替换后的{}。
我们可以像C编程一样迭代循环。
#!/bin/bash
for ((i=1; i<=20; i=i+1))
do
echo $i
done