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