8

当 seq 编号是变量时,我在 Bash 中遇到内置序列(即:不使用 seq)的问题。例如,这有效并打印我 1 2 3:

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

但是这个 :

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

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

这适用于 ZSH,我知道我有另一种方法来制作计数器,但想知道这是错误还是大括号扩展功能!

4

7 回答 7

5

在 Bash 中,大括号扩展是在变量扩展之前执行的。有关订单,请参阅外壳扩展

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

如果要使用变量,请使用forShawn 的答案中的 C 样式循环。

于 2011-02-10T16:19:48.837 回答
4

另一种方法是使用允许 C 样式循环的双括号结构:

A=3
for (( i=1; i<=$A; i++ )); do
    echo $i
done
于 2011-02-10T11:39:35.497 回答
3
$ num=3
$ for i in $( eval echo {1..$num});do echo $i;done
1
2
3
于 2011-02-10T11:38:45.803 回答
2
    #!/bin/bash - see comment for list of obsolete bash constructs
    function f_over_range {
        for i in $(eval echo {$1..$2}); do
            f $i
        done
    }

    function f {
        echo $1
    }

    #POSIX-compliant
    f_over_range() {
        for i in $(eval echo {$1..$2}); do
            f $i
        done
    }

    f() {
        echo $1
    }


    f_over_range 0 5
    f_over_range 00 05

笔记:

  • 使用 eval 暴露命令注入安全风险
  • Linux 将打印“00\n01\n02..etc”,但 OSX 将打印“0\n1\n2\n...etc”
  • 使用 seq 或 C 风格的 for 循环不会匹配大括号扩展对前导零的处理
于 2018-08-24T19:24:25.743 回答
1

其他选项是使用 seq 命令:

a=3; for i in $(seq 1 $a);do echo $i;done
于 2016-02-17T20:54:49.833 回答
0

我还需要做类似的事情:

n=某个数字;{1..$n..增量}

所以我使用了这个解决方法:

n=100  
i=1
while [ $i -lt $n ]
do
echo $i
i=$(( $i+1 ))
done
于 2017-11-05T08:01:17.427 回答
-1

尝试这个:

$ start=3
$ end=5
$ echo {$(echo $start)..$(echo $end)}
于 2016-06-23T02:51:23.783 回答