shell脚本“for”循环语法

我已经得到以下工作:

因为我在{2..10}
做
    回声“输出:$我”
 DONE

它会产生一串output: 2output: 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 ? 那么一个穷人与perlseq怎么样呢?

 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 -czsh -c时,上面的Bash方式也适用于kshzsh

注意: for i in {2..${max}}; do echo $i; done for i in {2..${max}}; do echo $i; donezshksh 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后的{}