我已经得到以下工作:
for i in {2..10} do echo "output: $i" done
它会生成一系列output: 2、output: 3等行。
output: 2
output: 3
然而,试图运行以下程序:
max=10 for i in {2..$max} do echo "$i" done
产生以下结果:
output: {2..10}
我怎样才能让编译器意识到它应该把$max作为数组的另一端,而不是字符串的一部分?
如果你的系统上有seq命令:
seq
for i in `seq 2 $max` do echo "output: $i" done
如果不是,那么使用穷人的seq和perl:
perl
seq=`perl -e "\$,=' ';print 2..$max"` for i in $seq do echo "output: $i" done
注意那些引号。
大括号展开,{x . . y}在其他展开之前执行,因此不能将其用于变长序列。
相反,使用seq 2 $max方法作为用户mob。
seq 2 $max
所以,在你的例子中,它会是:
max=10 for i in `seq 2 $max` do echo "$i" done
好吧,因为我没有在我的系统上安装seq命令(Mac OS X v10.6.1 (Snow Leopard)),我最终使用了while循环:
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,你可以使用算术为循环:
max=10 for (( i=0; i < max; i++ )); do echo "output: $i"; done
或者在BSD系统上使用记(1):
for i in $( jot 0 10 ); do echo "output: $i"; done
试试for的算术表达式版本:
for
max=10 for (( i=2; i <= $max; ++i )) do echo "$i" done
这在大多数bash版本中都可用,并且应该与Bourne shell (sh)兼容。
有不止一种方法。
max=10 for i in `eval "echo {2..$max}"` do echo "$i" done
使用:
max=10 for i in `eval echo {2..$max}` do echo $i done
你需要显式的“eval”调用来重新计算变量替换后的{}。
这里它在mac os X上运行。
它包括一个BSD日期的例子,如何增加和减少日期:
for ((i=28; i>=6 ; i--)); do dat=`date -v-${i}d -j "+%Y%m%d"` echo $dat done
这是一种方法: Bash: < / p >
max=10 for i in $(bash -c "echo {2..${max}}"); do echo $i; done
上面的Bash方法也适用于ksh和zsh,当bash -c分别被ksh -c或zsh -c取代时。
ksh
zsh
bash -c
ksh -c
zsh -c
注:for i in {2..${max}}; do echo $i; done适用于zsh和ksh。
for i in {2..${max}}; do echo $i; done
{1..8}
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
我们可以像C编程一样迭代循环。
#!/bin/bash for ((i=1; i<=20; i=i+1)) do echo $i done