【问题标题】:Why is `for i in {1..10}` different from `for ((i=1; i<=10; i++))`?为什么 `for i in {1..10}` 与 `for ((i=1; i<=10; i++))` 不同?
【发布时间】:2021-04-13 20:56:01
【问题描述】:

我通过 bash 脚本编写了一个简单的代码,

代码 1

for((i=1;i<=10;i++))
do
        echo $i 
        i=$((i+1))
        echo $i
        i=$((i+2))
done

代码 1 的输出

1
2
5
6
9
10

代码 2

for i in {1..10}
do
        echo $i 
        i=$((i+1))
        echo $i
        i=$((i+2))
done

代码 2 的输出

1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9
10
10
11

我只是想知道,为什么输出不一样?
提前谢谢

【问题讨论】:

  • 顺便说一句,{1..10} 并不特定于 for 循环——例如,您可以使用 echo {1..10},或者执行类似 mv {1..10} numbered_files/ 的操作。只有(( INIT; CHECK; INCR )) 方法是for 特定的语法,详细记录在wiki.bash-hackers.org/syntax/ccmd/c_for

标签: bash for-loop


【解决方案1】:

使用in,变量会遍历列表。您可以在循环中更改其值,但是当下一次迭代开始时,将为其分配下一个值,而不管您为其分配了什么值。 (而且我无法想象任何其他行为:shell 是否应该尝试猜测您想在列表中跳转多远?如果该值重复或根本不存在于列表中怎么办?)

使用 C 风格的for,变量被初始化,并且在每次迭代时,它的值都会改变并检查条件。没有值列表,只有结束循环的条件。

【讨论】:

    【解决方案2】:

    这些不是彼此的简写:它们是完全不同的代码,并且期望以不同的方式表现。

    {1..10} 只是1 2 3 4 5 6 7 8 9 10 的简写;当您运行for i in 1 2 3 4 5 6 7 8 9 10 时,您将那些确切的值 明确地分配给i,从而覆盖之前存在的任何其他内容。

    相比之下,for ((i=1; i&lt;=10; i++)) 提供了三个单独的语句:一个 initializer (i=1),告诉它如何启动循环; check (i&lt;=10) 告诉它如何判断循环是否结束;和一个 update (i++),告诉它在循环迭代之间做什么。这些是完全任意的命令,你可以在这些位置放置任何你想要的算术表达式。

    【讨论】:

    • 您和@choroba 的解释非常出色且完整。我真的不能选择其中一个答案作为主要答案。所以我给你们两个打个正分。祝你好运。
    • 抛硬币,如果这有帮助 - 授予复选框不仅仅是关于分数,它还会改变您的问题向其他人表示的方式,以表明它具有提出问题的人所包含的内容一个充分的答案。
    【解决方案3】:

    for((i=1;i&lt;=10;i++)) 循环可以这样重写:

    i=1                              # for loop's 'i=1'
    
    while [[ "${i}" -le 10 ]]        # for loop's 'i<=10'
    do
            echo $i
            i=$((i+1))
            echo $i
            i=$((i+2))
            ((i++))                  # for loop's 'i++'
    done
    

    这会产生......你猜对了......

    1
    2
    5
    6
    9
    10
    

    Charles Duffy 已经扩展了 for i in {1..10} 循环以显示其行为方式。

    【讨论】:

      猜你喜欢
      • 2016-03-18
      • 2014-08-09
      • 1970-01-01
      • 2020-02-16
      • 1970-01-01
      • 2011-07-27
      • 2015-08-17
      • 2012-08-25
      • 2017-05-17
      相关资源
      最近更新 更多