명령을 실행한 후 declare -i a=5
명령은 a+=2
성공하지만 명령이 a-=2
실패합니다. 누군가 bash의 이상한 동작을 설명할 수 있나요?
답변1
Bash에는 기본 쉘 구문에 -=
할당 연산자가 없습니다(산술 문맥은 다릅니다. 아래 참조). 즉, =
변수에 할당을 사용하거나, 정수가 아닌 변수에 추가하거나, 정수 변수에 추가할 수 있지만 +=
이와 관련된 것은 없습니다. Bash에서 구문을 차용한 Ksh에서도 마찬가지입니다(이 경우에는 다른 많은 경우와 마찬가지로). Zsh도 비슷한 기능을 가지고 있습니다.-=
*=
다른 조합 할당 연산자는 +=
어쨌든 정수가 아닌 변수에는 별로 의미가 없을 것이며 일반 "문자열" 변수가 가장 일반적인 변수이므로 기본 구문에서 이러한 연산자를 사용하는 것은 아마도 가치가 없을 것입니다. 특히 var*=123
그것은 구체이고 var/=123
경로처럼 보이기 때문입니다. 그러나 말했듯 +=
이 정수가 아닌 경우에는 작동합니다.
$ foo=123; foo+=456; echo $foo
123456
-=
평소와 같이 매뉴얼은 이에 대해 약간 간략하게 설명하고 누락으로 인한 결함만 문서화합니다. 부분3.4 쉘 매개변수변수 할당이 설명되고 언급되지만 +=
그 외에는 아무것도 없습니다.
물론, 산술적인 맥락에서 ( $(( .. ))
etc. (( .. ))
),등 모두 가능합니다 +=
.-=
*=
:
$ foo=456; (( foo -= 123 )); echo $foo
333
답변2
Bash에서는 산술 평가가 내부적으로 수행 됩니다 (( ))
. ((i=i+3))
~에서Bash 매뉴얼 페이지( man bash
),
((표현하다))
표현식은 아래 산술 평가에 설명된 규칙에 따라 평가됩니다.
-=
둘 다 +=
산술 평가 섹션에 문서화 되어 있으며 = *= /= %= <<= >>= &= ^= |=
둘 다 예상대로 작동합니다.
만약에산술 기호를 사용합니다.
+=
이 기호 없이 작업하는 것은 설명서의 매개변수 섹션에 설명된 예외입니다.
정수 속성이 설정된 변수에 +=를 적용하면 값은 산술 표현식으로 평가되고 변수의 현재 값에 추가되며 이 값도 평가됩니다.
대체로 원하는 동작을 얻으려면
#!/bin/bash
declare -i a=5
((a+=2))
echo $a
((a-=2))
echo $a
출력은 7과 5입니다.
답변3
+=
Bash는 속성이 정수 유형으로 설정된 변수와 함께 사용될 때 암시적 산술 계산을 허용합니다 declare -i
. 그렇지 않은 경우 -i
"추가" 작업 대신 "추가" 작업을 수행하도록 셸에 지시합니다. 또는 다른 연산자는 산술 문맥에서 사용되는 경우를 제외하고 -=
는 특별한 의미가 없습니다 .
GNU bash 매뉴얼 페이지에서 발췌한 내용을 참조하세요.
+=
정수 속성이 설정된 변수에 적용 하면 값은 산술 표현식으로 평가되고 변수의 현재 값에 추가되며 이 값도 평가됩니다.
declare -i var=2
var+=2
printf '%d\n' "$var"
4
아니요-i
declare foo=zoo
foo+=2
printf '%s\n' "$foo"
zoo2
이제 다른 연산자의 경우 *=
, /=
, %=
, -=
, <<=
, , 가 내부적 으로 지원됩니다 >>=
.&=
^=
|=
$((..))
foo=144; (( foo /= 12 )); printf '%d\n' "$foo"
12
+=
배열과 함께 사용할 때 관련된 또 다른 동작은 첫 번째 인덱스의 요소에 문자열을 arr+=foo
추가하는 것입니다.foo
arr+=(foo)
추가foo
배열에서 사용 가능한 다음 인덱스에 있는 새 요소입니다.
답변4
다른 답변에 대한 참고 사항왜 a-=2
작동하지 않습니다 (그리고((a-=2))
~ 할 것이다일하다). 나는 이것이 a+=-2
또한 작동할 것이라는 것을 문서화할 가치가 있다고 생각합니다 :
$ declare -i a=5
$ echo $a
5
$ a+=2
$ echo $a
7
$ a+=-2
$ echo $a
5