bash 루프의 @ 및 *

bash 루프의 @ 및 *

다음 두 루프가 동일한 출력을 생성하는 것으로 나타났습니다. 이 특별한 경우 @와 의 차이점이 무엇인지 이해하도록 도와주실 수 있나요?*

#!/bin/bash

ips=(8.8.8.8 8.8.4.4)

for ip in ${ips[@]}; do
    echo $ip
done

for ip in ${ips[*]}; do
    echo $ip
done

모두 동일한 결과를 생성합니다.

8.8.8.8
8.8.4.4

답변1

Bash 매뉴얼 페이지 인용문

${name[subscript]}를 사용하여 배열의 모든 요소를 ​​참조할 수 있습니다. 경로 이름 확장과의 충돌을 방지하려면 중괄호가 필요합니다. 아래 첨자가 @ 또는 *인 경우 단어는 name의 모든 구성원으로 확장됩니다.이러한 아래첨자는 단어가 큰따옴표 안에 나타나는 경우에만 달라집니다..

단어가 큰따옴표로 묶인 경우 ${name[*]}은 IFS 특수 변수의 첫 번째 문자로 구분된 각 배열 구성원의 값을 사용하여 단일 단어로 확장되는 반면 ${name[@]}은 각 단어를 확장합니다. 배열 요소 이름은 단일 단어입니다.

배열 멤버가 없으면 ${name[@]}은 비어 있는 상태로 확장됩니다. 단어 내에서 큰따옴표 확장이 발생하는 경우 첫 번째 인수의 확장은 원래 단어의 시작 부분과 연결되고 마지막 인수의 확장은 원래 단어의 마지막 부분과 연결됩니다.

의미는 다음과 같습니다

munai@munai-devops:~$ declare -a array
munai@munai-devops:~$ array=(1 2 3)
munai@munai-devops:~$ bakIFS=$IFS
munai@munai-devops:~$ IFS=","
munai@munai-devops:~$ echo "${array[*]}"
1,2,3
munai@munai-devops:~$ echo "${array[@]}"
1 2 3

답변2

알다시피, 둘 사이에는 차이가 없습니다. 즉, 배열이 참조되지 않는 경우입니다.

"${arr[*]}"배열을 하나의 요소로 확장하여 "${arr[@]}"각 요소를 확장하지만 공백은 유지합니다(IFS).

첫 번째 배열은 변경되지 않지만 두 번째 배열의 출력은 다음과 같습니다.

8.8.8.8 8.8.4.4

관련 정보