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. 이는 표현식이 다음과 같이 평가됨을 의미합니다.원래value 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이 아닌 경우 이 구성의 반환 값은 (( ))true( 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

의 "반환" 값은 ((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.

이는 반환값이 아닌 일반 값으로 변환된다는 뜻이다.

관련 정보