序列扩展和bash中的变量

时间:2011-02-10 11:36:38

标签: bash expansion

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

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

但是这个:

  

bash-3.2 $ a = 3;对于i {1 .. $ a};请回显$ i;完成

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

这适用于ZSH,我知道我可以选择制作一个反制品,但想知道这是一个bug还是大括号扩展功能!

7 个答案:

答案 0 :(得分:5)

在Bash中,在变量扩展之前执行大括号扩展。有关订单,请参阅Shell Expansions

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

如果你想使用变量,请使用C样式的for循环,如Shawn的答案。

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

其他选项是使用seq命令:

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

答案 4 :(得分:1)

    #!/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样式进行循环将不匹配括号扩展对前导零的处理

答案 5 :(得分:0)

我还需要像以下那样做:

  

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

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

$ ./bin/pselect_abp
AAAAAAAAAAA
BBBBBBBBBBB
AAAAAAP
PPPPPPPPPPP
BBBBBBBBBBB
AAAAAAzz
AAAAA
BBBBBBBBBBB
AAAqA

答案 6 :(得分:-1)

试试这个:

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