배열에 대해 for 루프를 사용하면 다른 결과가 나타납니다.

배열에 대해 for 루프를 사용하면 다른 결과가 나타납니다.

Bash의 배열에 몇 가지 문제가 있습니다.

이 배열이 주어지면:

 krn=(linux-image-4.15.0-30-generic linux-image-4.15.0-32-generic linux-image-4.15.0-33-generic)

다음 for 루프를 사용하여 반복하면 아무것도 변경하지 않고 다른 결과를 얻습니다.

첫 번째:

for krn in ${krn[@]};do echo $krn;done
linux-image-4.15.0-30-generic
linux-image-4.15.0-32-generic
linux-image-4.15.0-33-generic

두 번째:

for krn in ${krn[@]};do echo $krn;done
linux-image-4.15.0-33-generic
linux-image-4.15.0-32-generic
linux-image-4.15.0-33-generic

내가 뭘 잘못했나요?

C 스타일 배열 길이를 사용하면 이상하게 동작하지 않습니다.

for ((i=0; i<${#krn[@]}; i++)); do echo ${krn[i]};done

답변1

루프가 krn루프 변수로 사용됩니다. 이는 루프하는 배열의 이름이기도 합니다. 쉘은 배열 변수와 배열이 아닌 변수에 대해 별도의 네임스페이스를 유지하지 않습니다.

각 반복마다 krn배열의 현재 값으로 설정됩니다. 이는 각 반복에서 배열의 첫 번째 요소를 수정하는 효과가 있습니다. 루프는 루프가 끝난 후 첫 번째 요소가 마지막 요소의 복사본이 되도록 배열을 수정합니다.

이 문제를 해결하려면 루프 변수 또는 배열에 대해 다른 이름을 선택하십시오.


또한 "${krn[@]}"루프 헤더에 (확장, 큰따옴표)를 사용해야 합니다. ${krn[@]}따옴표 없이 사용하면 각 요소가 공백(또는 에 있는 모든 항목 $IFS)으로 분할되고 결과 단어에 대해 파일 이름 글로빙이 호출되기 때문입니다. echo "${krn[i]}"이후 루프에서도 마찬가지입니다.

배열에 요소가 하나 이상 있다고 가정하면 전체 루프를 다음으로 바꿀 수도 있습니다.

printf '%s\n' "${krn[@]}"

관련 정보