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后的{}