bash 中的序列扩展和变量

发布于 2024-10-16 16:07:51 字数 283 浏览 10 评论 0原文

当 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,我知道我有另一种方法可以制作计数器,但想知道这是否是一个错误或大括号扩展功能!

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 :

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!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

如果没有你 2024-10-23 16:07:51

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

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

如果您想使用变量,请使用 C 风格的 for 循环,如 Shawn 的回答所示。

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.

最舍不得你 2024-10-23 16:07:51

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

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

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
带刺的爱情 2024-10-23 16:07:51
$ num=3
$ for i in $( eval echo {1..$num});do echo $i;done
1
2
3
$ num=3
$ for i in $( eval echo {1..$num});do echo $i;done
1
2
3
划一舟意中人 2024-10-23 16:07:51
    #!/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 循环不会' t 匹配大括号扩展对前导零的处理
    #!/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
昇り龍 2024-10-23 16:07:51

其他选项是使用 seq 命令:

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

Other option is to use seq command:

a=3; for i in $(seq 1 $a);do echo $i;done
黯淡〆 2024-10-23 16:07:51

我还需要做一些类似的事情:

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

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

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

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
东北女汉子 2024-10-23 16:07:51

试试这个:

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

try this:

$ start=3
$ end=5
$ echo {$(echo $start)..$(echo $end)}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文