2011-02-10 120 views
6

当seq编号是变量时,我在Bash中的内建序列(即:不使用seq)存在问题。例如,此工作和打印箱1 2 3:序列扩展和bash中的变量

for i in {1..3};do echo $i;done 

但这:

的bash-3.2 $一个= 3;对于i在{1 .. $一个};做回声$我;做

失败,并打印我{} 1..3仅

这适用于ZSH,我知道我有一个替代方案,使计数器的事情,但不知道是否这是一个错误或支柱扩展功能!

+1

可能重复http://stackoverflow.com/ question/4764383/arguments-passed-in-for-loop-in-bash-script) – 2011-02-10 11:40:28

回答

4

在bash,支架膨胀变量扩展之前进行。订单请参阅Shell Expansions

$ a=7; echo {1..3} {4..$a} 
1 2 3 {4..7} 

如果要使用变量,请使用C样式for循环,如Shawn的答案中所述。

3
$ num=3 
$ for i in $(eval echo {1..$num});do echo $i;done 
1 
2 
3 
+0

看起来像一种黑客给我...但是,谢谢.. – 2011-02-10 11:41:15

+0

比C风格的循环效率低(由于使用一个子外壳)并承担安全风险:除非完全控制或验证了传递给`eval`的字符串中使用的变量的值,否则不要使用`eval`。否则,可能会执行任意命令。例如,以下精心设计的`$ num`值将枚举当前用户的主文件夹中的文件: `num ='}; ls〜; {';我在$(eval回声{1 .. $ num});做echo $ i;完成` – mklement0 2016-06-23 03:19:03

4

另一种方法是使用双括号构建体,其允许C样式循环:

A=3 
for ((i=1; i<=$A; i++)); do 
    echo $i 
done 
+0

嗨,我不感兴趣使用外部命令,但内部bash内建。 – 2011-02-10 11:40:40

+0

他不想使用`seq` – kurumi 2011-02-10 11:40:57

1

另一种选择是使用序列命令:

a=3; for i in $(seq 1 $a);do echo $i;done 
-1

试试这个:

$ start=3 
$ end=5 
$ echo {$(echo $start)..$(echo $end)} 
0

我也需要做somenthing,如:

N =一些数量; {1 .. $ n..increment}

所以就用该替代方法:

n=100 
i=1 
while [ $i -lt $n ] 
do 
echo $i 
i=$(($i+1)) 
done 
的[在bash脚本传递到用于环路参数](