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[@]}"