bashincrement: `n=0;((n++));`가 오류를 반환하는 이유는 무엇입니까? [복사]

bashincrement: `n=0;((n++));`가 오류를 반환하는 이유는 무엇입니까? [복사]
n=0;
((n++));echo "ret=$?;n=$n;"
((n++));echo "ret=$?;n=$n;"
((n++));echo "ret=$?;n=$n;"

처음 부터 오류가 반환되는 경우에만 작동 n=1하고 문제가 발생한 상황을 사용하고 있습니다.((n++))
n=0((n++))
trap '' ERR

이거 버그인가요?

답변1

이는 의 반환 값이 (( expression ))오류 표시에 사용되지 않기 때문입니다. bash맨페이지 에서 :

((표현하다))

이것표현하다아래 설명된 규칙에 따라 평가됩니다.산술 평가. 표현식이 0이 아닌 것으로 평가되면 반환 상태는 0이고, 그렇지 않으면 반환 상태는 1입니다. 이것은 정확히 동일합니다허락하다"표현하다".

따라서 귀하의 경우에는 표현식의 값이0, 반환 상태는 (( ... ))1입니다.

답변2

그 이유는 위의 pmos에 적힌 바와 같습니다.

한 가지 해결책은 증분을 사용하는 것입니다 ((++n)). 귀하의 표현식은 결코 0으로 평가되지 않으므로 오류가 발생하지 않는 것 같습니다.

답변3

당신이 해야 할 일:

echo "$((n+=1))"

함정은 발생하지 않습니다. 유일한 보상은 에서 나옵니다 echo.

또는 독립 실행형으로 사용하려는 경우 $n다음 두 형식은 20자리 미만인 경우 항상 true를 반환합니다.

n=$((n+1))

또는:

: "$((n+=1))"

관련 정보