Вы можете поместить вычисление в круглые скобки...
root@beaglebone:~/bbbrtc# date -d "@1524884843+(1 month)"
Sat Apr 28 03:07:23 UTC 2018
Это потому, что 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
также увеличивается.
Возвращаемое значение конструкции (( ))
является истинным (0
), если значение не равно нулю, и наоборот.
Вы также можете проверить, как работает оператор приращения post -:
$ i=0
$ echo $((i++))
0
$ echo $i
1
И пре -приращение для сравнения:
$ i=0
$ echo $((++i))
1
$ echo $i
1
]# i=0; ((i++)) && echo true || echo false
false
]# i=0; ((++i)) && echo true || echo false
true
'Возвращаемое' значение ((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.
Это означает, что оно стало нормальным, а не возвращаемым значением.