【问题标题】:Variable in for loop digits [duplicate]for循环数字中的变量[重复]
【发布时间】:2013-06-24 09:33:20
【问题描述】:

如何在 for 循环数字中使用变量?

例如:

num="12"
for i in {0..$num}; do
        ...
done

【问题讨论】:

    标签: linux bash


    【解决方案1】:

    使用变量的大括号扩展并不像预期的那样工作(请参阅附录 B 了解详细信息),即 {0..$num} 只会返回 {0..12},而不是数字列表。

    试试seq,像这样:

    num="12"
    for i in $(seq 0 $num); do
        echo $i
    done
    

    附录 B:多汁的细节

    bash manual 说,

    扩展的顺序是:大括号扩展、波浪号扩展、参数、变量、算术扩展和命令替换(以从左到右的方式进行)、分词和文件名扩展。

    在 shell 扩展 {0..$num}(大括号扩展)时,$num 尚未扩展(变量扩展)。序列表达式a..b 需要ab 都是数字来生成序列,但这里我们有一个数字和一个非数字(文字字符串$num)。如果做不到这一点,shell 会退回到字面上解释 {0..$num} 。然后变量展开接管,最后我们得到{0..12}

    【讨论】:

    • 大括号扩展不支持变量不完全正确 :)
    • @JS웃,是的,措辞是错误的。我添加了更恰当的解释。
    • +1 表示更新并添加了说明。尽管进行了较小的修正,但在 brace expansion 报告为 {1..12} 而不是 {1..$num} 失败后,$num 将会扩大,但我想 OP 现在将获得更大的图景。
    【解决方案2】:

    Bash 大括号扩展 之前 变量扩展,所以你会得到像{1..12}这样的输出.使用eval 可以让它工作。

    测试:

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

    请注意:eval is evil in disguise.

    【讨论】:

    • evalevil 甚至听起来很像!
    猜你喜欢
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 2020-04-05
    • 2023-03-31
    相关资源
    最近更新 更多