1

我是 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

4 回答 4

3

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

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

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

于 2013-07-26T03:58:33.793 回答
2

也许你可以试试这个

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

你可以看到这个答案

大括号扩展, {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
于 2013-07-26T03:08:45.517 回答
1

{x..y}只有当xy是文字数字或单个字符时,才会出现这种形式的序列表达式。它发生在变量扩展之前。如果限制可以包含变量,请使用以下seq命令:

for i in $(seq 1 $max)
于 2013-07-26T03:04:24.180 回答
1

bash 手册页是这样说的:

大括号扩展在任何其他扩展之前执行,并且任何其他扩展的特殊字符都保留在结果中。它是严格的文本。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
于 2013-07-26T03:20:33.213 回答