+= 연산자가 값을 증가시키지 못하는 이유는 무엇입니까?

+= 연산자가 값을 증가시키지 못하는 이유는 무엇입니까?

+=가 스크립트에서 연결로 사용되는 이유는 무엇입니까?

while read t
do
    t+=2
echo $t

마지막에 2개를 추가했는데...왜죠?

답변1

대부분의 Bourne 유사 쉘(ksh, bash, zsh)에서 +=연산자는 세 가지 다른 변수 유형에 대해 작동합니다.

일반 변수(문자열 변수)의 경우 다음과 같은 일이 발생합니다.

$ a=hello
$ a+=3
$ echo "$a"
hello3

변수가 정수 유형으로 정의되거나 연산이 산술 환경에서 수행되는 경우 연산자는 C 언어에서 일반적인 의미를 갖습니다.

$ typeset -i a
$ a=31
$ a+=3
$ echo "$a"
34

또는 산술 환경에서:

$ unset a
$ a=31
$ let a+=3           # an odd example to make you think!!.
                     # better use ((a+=3))
                     # or, in a POSIX sh: [ $((a+=3)) -eq 0 ]
$ echo "$a"
34

또한 +=배열에 요소를 추가하는 데에도 사용됩니다(셸에 배열이 있는 경우).

$ unset a
$ a=()
$ a+=(one)
$ a+=(111)
$ printf '<%s> ' "${a[@]}"; echo
<one> <111>

따라서 원래 질문에 대한 대답은 다음과 같습니다.

+=가 스크립트에서 연결로 작동하는 이유는 무엇입니까?

t일반 문자열 변수이기 때문입니다 (산술 컨텍스트 외부에서 사용됨).

답변2

기능이 풍부한 POSIX 유사 셸(ksh, mksh, Bash, zsh)에서 +=연산자는일반 스칼라 변수와 함께 사용되는 문자열 연결 연산자입니다. 당신이 보는 결과는 당신이 기대했던 것과 정확히 같습니다. 을 늘리려면 t다음과 같이 할 수 있습니다.

while read t; do
  (( t+=2 ))
  echo $t
done

또는:

while read t; do
  t=$(( t+2 ))
  echo $t
done

등.

이 주제에 대해 확장된 토론이 있습니다.여기.

관련 정보