배열 할당 동작

배열 할당 동작

Bash에서는 인쇄할 때 배열이 다르게 동작합니다 a=( 11 22 ).b=$(echo "11 22")

$ a=( 11 22 )
$ b=$(echo "11 22")
$ echo $b
11 22
$ echo $a
11

전체 내용을 인쇄 a하려면 .${a[*]}$a

괄호를 통한 배열 할당과 명령 대체를 통한 배열 할당 간의 동작 차이를 어떻게 설명할 수 있나요?

답변1

다음 의견을 주신 @cas에게 감사드립니다.
$b는 배열이 아니며 "11 22"를 포함하는 문자열입니다.

동등하다

a=( 11 22 )

b=($(echo "11 22"))

그러므로

$ a=( 11 22 )
$ b=($(echo "11 22"))
$ echo $a
11
$ echo ${a[*]}
11 22
$ echo $b
11
$ echo ${b[*]}
11 22

답변2

배열(예: arr)의 경우 일반적인 변수 참조 표기법을 사용하여 배열을 참조하는 것은 즉, 배열의 첫 번째 요소를 참조하는 것과 $arr같습니다 . ${arr[0]}이것이 귀하의 경우에 일어나는 일입니다.

배열의 모든 요소를 ​​참조 하려면 거의 항상 "${arr[@]}". "${arr[*]}"왜냐하면 후자의 경우 이와 같이 참조하면 요소는 다음과 같이 나타나기 때문입니다.단일 문자열의 첫 번째 문자가 IFS구분 기호로 사용됩니다. 기본적으로( IFS공백, 탭 또는 개행 문자인 경우) 공백이 구분 기호가 됩니다.

따옴표가 없으면 ${arr[@]}추가 토큰화 및 경로 이름 확장을 통해 배열의 모든 요소로 확장됩니다.

참고할 수 있는 예는 다음과 같습니다.

$ a=( 11 22 )
$ printf '%s\n' "$a"
11
$ printf '%s\n' "${a[0]}"
11
printf '%s\n' "${a[*]}"
11 22
$ printf '%s\n' "${a[@]}"
11
22

이제 의 경우 b=$(echo "11 22")명령 대체를 수행하고 echo "11 12"(서브쉘에서) 실행하면 결과가 변수에 저장됩니다 b.이것은 배열이 아닙니다.. 따라서 -ing 을 얻을 11 12echo있습니다 $b.

11 12변수 할당의 오른쪽 부분은 토큰화되지 않으므로 문자열 사이에 공백이 있어도 문자열이 변수에 저장됩니다.b

관련 정보