Bash 배열에서 여러 단어 문자열 조작

Bash 배열에서 여러 단어 문자열 조작

다음과 같은 간단한 스크립트가 있습니다.

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변수 문자열을 출력하기 위해 항상 이것을 사용하는 이유):

관련 정보