Bash 배열 값을 참조할 때 [@]와 [*]의 차이점은 무엇입니까?

Bash 배열 값을 참조할 때 [@]와 [*]의 차이점은 무엇입니까?

이 배쉬 가이드설명하다:

인덱스 번호가 @또는 *이면 배열의 모든 멤버가 참조됩니다.

내가 이것을 할 때 :

LIST=(1 2 3)
for i in "${LIST[@]}"; do
  echo "example.$i"
done

원하는 결과를 제공합니다.

example.1
example.2
example.3

하지만 을 사용 ${LIST[*]}하면

example.1 2 3

대신에.

왜?

편집: 이것은 실제로 를 사용할 printf때 동일한 결과를 제공합니다 .@*

답변1

차이점은 미묘합니다. "${LIST[*]}"(like "$*")는 단일 인수를 생성하는 반면 "${LIST[@]}"(like "$@")는 각 항목을 별도의 인수로 확장합니다.

LIST=(1 2 3)
for i in "${LIST[@]}"; do
    echo "example.$i"
done

목록을 여러 변수로 처리합니다(인쇄).

하지만:

LIST=(1 2 3)
for i in "${LIST[*]}"; do
    echo "example.$i"
done

목록은 변수로 처리됩니다.

답변2

사용하면 [*]생성됩니다단일 문자열, 배열의 각 요소는 $IFS요소 사이의 첫 번째 문자와 연결됩니다(기본값은 공백).

사용하면 [@]생성됩니다목록.

예:

배열을 만듭니다.

$ list=( a b "big fish" c d )

각 요소를 개별적으로 인쇄합니다.

$ printf 'data: ---%s---\n' "${list[@]}"
data: ---a---
data: ---b---
data: ---big fish---
data: ---c---
data: ---d---

단일 문자열을 만들고 인쇄합니다.

$ printf 'data: ---%s---\n' "${list[*]}"
data: ---a b big fish c d---

다시 말하지만 맞춤 구분 기호를 사용하면 다음과 같습니다.

$ IFS='/'
$ printf 'data: ---%s---\n' "${list[*]}"
data: ---a/b/big fish/c/d---

이 확장 프로그램을 사용하는 경우아니요큰따옴표는 거의 의미가 없습니다.


의 첫 번째 문자가 멀티바이트 문자이거나 문자로 디코딩할 수 없는 문자인 경우 $IFS설정되지 않은 경우(이후 IFS=), $IFS설정되지 않은 경우(이후)에는 아무것도 없지만 그 사이에 일부가 있습니다. 껍질 차이.unset -v IFS$IFS

답변3

목록 요소에 공백과 같은 특수 문자가 포함되지 않은 간단한 경우를 생각해 보십시오. 그런 다음 따옴표를 제거할 수 있습니다. 그러면 @와 *는 동일한 결과를 제공합니다.

LIST=(1 2 3)
for i in ${LIST[*]}; do
  echo "example.$i"
done

산출:

example.1
example.2
example.3

이제 요소에 공백이 포함된 경우를 고려해보세요.

LIST=(1 "a b" 3)
for i in ${LIST[*]}; do
  echo "example.$i"
done

이 경우 @ 및 *는 여전히 동일한 결과를 제공합니다.

example.1
example.a
example.b
example.3

그러나 "ab"는 하나가 아닌 두 개의 요소로 분할되기 때문에 이는 우리가 원하는 것이 아닙니다. 따라서 이를 방지하려면 따옴표를 사용해야 합니다.

LIST=(1 "a b" 3)
for i in "${LIST[*]}"; do
  echo "example.$i"
done

그러나 그것은 밝혀졌습니다 example.1 a b 3. 다음으로 *를 @로 변경합니다.

LIST=(1 "a b" 3)
for i in "${LIST[@]}"; do
  echo "example.$i"
done

마침내 우리는 원하는 결과를 얻었습니다.

example.1
example.a b
example.3

위의 결과를 요약하면 @는 따옴표와 같은 특정 연산자에 의해 연산될 때 요소별 연산을 허용한다는 것을 알 수 있습니다.

관련 정보