Увеличение переменной Bash, непоследовательное поведение

Увеличение переменной Bash, непоследовательное поведение

Я подозреваю, что это сделано намеренно (а не просто ошибка). Если так, пожалуйста, отправьте меня к соответствующей документации для обоснования.

~$ i=0; ((i++)) && echo true || echo false
false
~$ i=1; ((i++)) && echo true || echo false
true

Единственное различие между этими двумя строками — i=0vs.i=1

решение1

Это потому i++что пост-инкремент, как описано в man bash. Это означает, что значение выражения равнооригинальныйзначение i, а не увеличенное значение.

ARITHMETIC EVALUATION
       The  shell  allows  arithmetic  expressions  to  be  evaluated, under certain circumstances (see the let and
       declare builtin commands and Arithmetic Expansion).  Evaluation is done  in  fixed-width  integers  with  no
       check for overflow, though division by 0 is trapped and flagged as an error.  The operators and their prece-
       dence, associativity, and values are the same as in the C language.  The  following  list  of  operators  is
       grouped into levels of equal-precedence operators.  The levels are listed in order of decreasing precedence.

       id++ id--
              variable post-increment and post-decrement

Так что:

i=0; ((i++)) && echo true || echo false

действует как:

i=0; ((0)) && echo true || echo false

за исключением того, что iтоже увеличивается; и что:

i=1; ((i++)) && echo true || echo false

действует как:

i=1; ((1)) && echo true || echo false

за исключением того, что iон тоже увеличивается.

Возвращаемое значение конструкции (( ))— truey ( 0), если значение не равно нулю, и наоборот.

Вы также можете проверить, как работает оператор пост-инкремента:

$ i=0
$ echo $((i++))
0
$ echo $i
1

И предварительный инкремент для сравнения:

$ i=0
$ echo $((++i))
1
$ echo $i
1

решение2

]# i=0; ((i++)) && echo true || echo false
false

]# i=0; ((++i)) && echo true || echo false
true

Возвращаемое значение an ((expression))зависит от префикса или постфикса. И тогда логика такова:

     ((expression))

     The expression is evaluated according to the rules described be low under ARITHMETIC EVALUATION.

     If the value of the expression is non-zero,
     the return status is 0; 

     otherwise the return status is 1.

Это означает, что он преобразуется в нормальное значение, а не в возвращаемое значение.

Связанный контент