Sequences expansion and variable in bash [duplicate]

ぃ、小莉子 提交于 2019-11-26 14:43:56

问题


This question already has an answer here:

  • Brace expansion with variable? [duplicate] 6 answers

I am having a problem with builtin sequences (ie: not using seq) in Bash when the seq number is a variable. For example, this works and print me 1 2 3:

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

but this :

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

fail and print me {1..3} only

This works with ZSH and I know I have an alternative to make a counter thing but wondering if this is a bug or a brace expansion feature!


回答1:


In Bash, brace expansion is performed before variable expansion. See Shell Expansions for the order.

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

If you want to use a variable, use C-style for loops as in Shawn's answer.




回答2:


An alternative would be to use the double-parenthesis construct which allows C-style loops:

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



回答3:


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



回答4:


Other option is to use seq command:

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



回答5:


    #!/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

Notes:

  • Using eval exposes command injection security risk
  • Linux will print "00\n01\n02..etc", but OSX will print "0\n1\n2\n...etc"
  • Using seq or C-style for loops won't match brace expansion's handling of leading zeros



回答6:


I also needed to do somenthing like:

n=some number; {1..$n..increment}

so I used this workaround:

n=100  
i=1
while [ $i -lt $n ]
do
echo $i
i=$(( $i+1 ))
done



回答7:


try this:

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


来源:https://stackoverflow.com/questions/4956584/sequences-expansion-and-variable-in-bash

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!