Я подозреваю, что это сделано намеренно (а не просто ошибка). Если так, пожалуйста, отправьте меня к соответствующей документации для обоснования.
~$ i=0; ((i++)) && echo true || echo false
false
~$ i=1; ((i++)) && echo true || echo false
true
Единственное различие между этими двумя строками — i=0
vs.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.
Это означает, что он преобразуется в нормальное значение, а не в возвращаемое значение.