+=가 스크립트에서 연결로 사용되는 이유는 무엇입니까?
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
등.
이 주제에 대해 확장된 토론이 있습니다.여기.