对于Unix中的循环

时间:2013-07-26 02:59:23

标签: shell unix

我是Unix编程的新手,我无法弄清楚这段代码有什么问题:

#!/bin/sh
    i=1
    max=10
        for i in {1..$max}
        do
            echo $i;
        done

如果我按照以下方式尝试上述代码,则可以:

#!/bin/sh
    i=1
    max=10
        for i in {1..10}
        do
            echo $i;
        done

我试过这个:

#!/bin/sh
    i=1
    max=10
        for i in {1..`echo $max`}
        do
            echo $i;
        done

#!/bin/sh
    i=1
    max=10
        for i in {1..`expr $max`}
        do
            echo $i;
        done

#!/bin/sh
    i=1
    max=10
        for i in {1..`echo $max | bc`}
        do
            echo $i;
        done

但它也不起作用..谁能告诉我它怎么会起作用??

4 个答案:

答案 0 :(得分:3)

Bash / zsh支持更快更灵活的形式:

for ((i=1; i<$max; ++i));

不要使用外部命令(如seq)或反引号 - 它会减慢你的脚本速度。

答案 1 :(得分:2)

也许你可以试试这个

#!/bin/sh
max=10
for i in $(seq 1 $max)
do
    echo "$i"
done

您可以看到此answer

  

大括号扩展,{x..y}在其他扩展之前执行,因此你不能将它用于可变长度序列。

更新

如果您需要一系列自定义增量,seq的手册页会给出以下内容:

seq [-w] [-f format] [-s string] [-t string] [first [incr]] last

因此,您可以使用seq 1 3 $max来获取增量为3的序列。

一般来说,

#!/bin/sh
max=10
incr=3
for i in $(seq 1 $incr $max)
do
    echo "$i"
done

答案 2 :(得分:1)

{x..y}x为字面数字或单个字符时,才会生成y形式的序列表达式。它发生在变量扩展之前。如果限制可以包含变量,请使用seq命令:

for i in $(seq 1 $max)

答案 3 :(得分:1)

bash手册页说:

  

在任何其他扩展之前执行大括号扩展,并且在结果中保留对其他扩展特殊的任何字符。这是严格的tex-   图阿尔。 Bash不对扩展的上下文或大括号之间的文本应用任何语法解释。

所以看起来bash只是逐字逐句地传递大括号中的文字。我不熟悉那种语法,我不得不查阅它。它听起来并不像是用于for循环。

bash有更新的方法,但传统方式是

for i in $(seq 1 $max)
do
 # whatever...
done

由于任何事情都可以通过足够的努力在bash中完成,而且我无法拒绝挑战,所以无论如何你都可以用括号做到这一点:

for i in $(eval echo {1..$max})
do
 echo $i
done