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

Вы можете поместить вычисление в круглые скобки...

root@beaglebone:~/bbbrtc# date -d "@1524884843+(1 month)"
Sat Apr 28 03:07:23 UTC 2018
1
08.03.2020, 16:42
2 ответа

Это потому, что 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
8
28.04.2021, 23:21
]# 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.

Это означает, что оно стало нормальным, а не возвращаемым значением.

3
28.04.2021, 23:21

Теги

Похожие вопросы