当参数位置发生变化时,bash for循环的行为会有所不同

时间:2018-02-12 19:12:23

标签: bash for-loop

通过更改最后两个参数的位置来检查bash for循环。

下面的代码打印:

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

但是下面的代码打印出我能看到的所有自然数字:

$ for ((i=1;i++;i<2)); do echo $i; done   
1    
2   
3   
4    
5 
6
.
.
.

这是什么原因?

1 个答案:

答案 0 :(得分:0)

这是man bash

   for (( expr1 ; expr2 ; expr3 )) ; do list ; done
          First, the arithmetic expression expr1 is evaluated according to
          the  rules  described  below  under  ARITHMETIC EVALUATION.  The
          arithmetic expression expr2 is then evaluated  repeatedly  until
          it  evaluates  to zero.  Each time expr2 evaluates to a non-zero
          value, list is executed and the arithmetic expression  expr3  is
          evaluated.   If  any  expression is omitted, it behaves as if it
          evaluates to 1.  The return value is the exit status of the last
          command in list that is executed, or false if any of the expres‐
          sions is invalid.

特别注意:

  

每次expr2计算为非零值时,执行list并计算算术表达式expr3。

在您的情况下,

expr2i++2^64 = 18446744073709551616次迭代后整数回绕之前不会计算为0。

expr3i<2将在第一次迭代后评估为0,但正如您从描述中看到的,这对任何事情都没有影响。