다음과 같은 간단한 스크립트가 있습니다.
names=("windows" "ubuntu" "raspbian" "debian" "kali linux")
echo "names array length: ${#names[@]}"
for n in ${names[@]}; do
echo $n
done
내가 의도하고 얻고자 하는 것은 다음과 같습니다.
names array length: 5
windows
ubuntu
raspbian
debian
kali linux
그러나 내가 얻는 결과는 다음과 같습니다.
names array length: 5
windows
ubuntu
raspbian
debian
kali
linux
배열의 항목 수가 올바른 것으로 보이지만 인쇄 결과는 5행이 아닌 6행에 나타납니다. 원하는 출력을 어떻게 얻을 수 있습니까?
답변1
큰따옴표 변수 확장을 사용 ${names[@]}
하면 배열 요소로 확장됩니다.혼자 인용. Unquote 변수 확장을 사용하면 쉘이 공백으로 모든 요소를 분할하고(기본적으로) 생성된 모든 단어에 대해 추가로 파일 이름 글로빙을 수행합니다(사용하는 단어와는 상관 없음). 귀하의 예에서는 두 개의 별도 단어가 생성되어 처리 kali
됩니다 .linux
그러므로
for name in "${names[@]}"; do
printf '%s\n' "$name"
done
또는 이 간단한 스크립트의 경우
printf '%s\n' "${names[@]}"
printf
( 해당 형식 문자열은 각 개별 인수에 대해 단순히 재사용되므로 루프가 필요하지 않습니다 .)
관련된:
추가적으로 ( printf
변수 문자열을 출력하기 위해 항상 이것을 사용하는 이유):