shell脚本“for”循环语法
我已经得到以下工作:
因为我在{2..10}
做
    回声“输出:$我”
 DONE
它会产生一串output: 2 , output: 3 ,依此类推。 
但是,试图运行以下内容:
最大= 10
对于我在{2 .. $ max}
做
    回声“$我”
 DONE
产生以下内容:
 输出:{2..10} 
我怎样才能让编译器意识到它应该把$ max作为数组的另一端,而不是string的一部分?
括号扩展{x..y}是在其他扩展之前执行的,所以你不能使用它作为可变长度的序列。
 相反,使用seq 2 $max方法作为mobrule陈述。 
所以,对于你的例子,这将是:
 max=10 for i in `seq 2 $max` do echo "$i" done 
 尝试for的算术expression式版本: 
 max=10 for (( i=2; i <= $max; ++i )) do echo "$i" done 
这是在大多数版本的bash中可用的,也应该是Bourne shell(sh)兼容的。
手动步进循环:
 I = 0
最大= 10
而[$ i -lt $ max]
做
    回声“输出:$我”
    真$((i ++))
 DONE
如果您不必完全使用POSIX,则可以使用循环算术:
最大= 10 for((i = 0; i <max; i ++)); 做回声“输出:$我”; DONE
或者在BSD系统上使用jot (1):
因为我在$(记0 10); 做回声“输出:$我”; DONE
 您的系统上是否可以使用seq命令? 
 for i in `seq 2 $max` do echo "output: $i" done 
 编辑:没有seq ? 那么一个穷人与perl的seq怎么样呢? 
 seq=`perl -e "\$,=' ';print 2..$max"` for i in seq do echo "output: $i" done 
看那些引号。
有不止一种方法来做到这一点。
 max=10 for i in `eval "echo {2..$max}"` do echo "$i" done 
 这是一个方法: 
 击: 
 max=10 for i in $(bash -c "echo {2..${max}}"); do echo $i; done 
 当bash -c被replace为ksh -c或zsh -c时,上面的Bash方式也适用于ksh和zsh 。 
 注意: for i in {2..${max}}; do echo $i; done for i in {2..${max}}; do echo $i; done 在zsh和ksh for i in {2..${max}}; do echo $i; done工作。 
这里它在MAC-OS上工作//它包括BSDdate的例子,如何在date中递增和递减
 for ((i=28; i>=6 ; i--)); do dat=`date -v-${i}d -j "+%Y%m%d"` echo $dat 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 
 那么,因为我的系统中没有安装seq命令(Mac OS 10.6.1),所以我最终使用了一个while循环: 
最大= 5
 I = 1
而[$ max -gt $ i]
做
     (东东)
 DONE
* 耸耸肩 *无论什么作品。
怎么样
 max=10 for i in `eval echo {2..$max}` do echo $i done 
您需要显式的“eval”调用来重新评估variablesreplace后的{}