【问题标题】:Defining ranges in bash for loops didn't work在 bash for 循环中定义范围不起作用
【发布时间】:2013-09-27 18:41:42
【问题描述】:

我在 bash 中有以下 for 循环,它在 chroot 目录中创建循环设备。

for var in 0 1 2 3 .. 7
do
    MAKEDEV -d ${CHROOT}/dev -x loop$var
done

这对我不起作用,因为它在创建 loop3 之后需要 .. 字面意思并尝试创建循环.. 并失败。但是根据这个tutorial 它应该可以工作。我通过执行以下操作使其工作:

for (( var=0; var<=7; var++ ))
do
    MAKEDEV -d ${CHROOT}/dev -x loop$var
done

我仍然想知道为什么我首先尝试的 for 循环不起作用。请帮忙。

【问题讨论】:

    标签: bash for-loop chroot


    【解决方案1】:

    在bash中,你可以写

    for var in {0..7}
    

    你不能说

    end=7
    for var in {0..$end}
    

    因为brace expansion occurs before variable expansion。如果您在变量中有范围点,则可以使用 C 风格的 for 循环(就像您所做的那样)或 seq

    for var in $(seq 0 $var)
    

    【讨论】:

    • 但是我没有使用范围内的变量。
    • 你没有,但有一天你会的,你会想知道为什么它不起作用。
    【解决方案2】:

    我认为您在阅读本教程时过于字面意思了。 turorial 确实

    for VARIABLE in 1 2 3 4 5 .. N
    

    但从字面上看,这不是正确的 bash 语法——我认为作者只是想说,对于这种 for 循环,您需要明确列出需要迭代的所有值。所以在你的情况下,这将是:

    for var in 0 1 2 3 4 5 6 7
    

    本教程还提到了大括号扩展,@glennjackman 在他的回答中给出了这也是完全正确的语法。

    【讨论】:

    • 不,.. 确实brace expansion 中工作 - 请参阅@glennjackman 的答案。
    猜你喜欢
    • 1970-01-01
    • 2018-07-13
    • 2011-03-01
    • 2019-04-10
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    相关资源
    最近更新 更多