이 배쉬 가이드설명하다:
인덱스 번호가
@
또는*
이면 배열의 모든 멤버가 참조됩니다.
내가 이것을 할 때 :
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
위의 결과를 요약하면 @는 따옴표와 같은 특정 연산자에 의해 연산될 때 요소별 연산을 허용한다는 것을 알 수 있습니다.