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 12
수 echo
있습니다 $b
.
11 12
변수 할당의 오른쪽 부분은 토큰화되지 않으므로 문자열 사이에 공백이 있어도 문자열이 변수에 저장됩니다.b