2008-09-17 4 views

답변

45

는 떠들썩한 파티 (POSIX 쉬 달리) 배열 지원

fruits=(apple orange kiwi "dried mango") 
for fruit in "${fruits[@]}"; do 
    echo "${fruit}" 
done 

이 해당 배열 요소 공백 또는 $ IFS의 다른 부재를 포함 할 수있는 이점을 갖고; 그것들이 정확하게 다른 요소들로 삽입되는 한, 그들은 같은 방식으로 읽혀진다.

+0

Debian 및 Mac OS X에서 bash를 사용하여 "건조한"및 "망고"인쇄를 별도의 과일로 볼 수도 있습니다. 따라서이 기능은 IFS를 보호하지 못하는 것 같습니다. :-( – emk

+0

emk, 그건 나쁘다 - 나는 zsh에 대해 테스트를하고 있었고, bash가 아니라 그 이후로 수정했다. –

+0

나는 이것이 작동하는 것을 확인할 수있다. – emk

4
 
for i in apple orange kiwi 
do 
    echo $i 
done 
+0

'echo "$ i"'- 따옴표없이, 이것은 glob 확장과 요소에 대한 IFS 분할을 수행하여'foo bar'를'foo bar'와 동일하게 만들고'* .txt' echo 리터럴'* .txt'을 내보내는 대신 현재 디렉토리에있는 모든 일치하는 파일을 찾습니다. –

11

: 당신의 과일의 이름에 공백이있는 경우이 작동하지 않습니다

FRUITS="apple orange kiwi" 
for FRUIT in $FRUITS; do 
    echo $FRUIT 
done 

알 수 있습니다. 이 경우 대신에 this answer을 참조하십시오. 이식성은 약간 적지 만 훨씬 강력합니다.

+0

Mac OS X의 Bash에서는 'do'앞에 세미콜론 또는 줄 바꿈이 필요합니다. – emk

+0

예, "do"가 새 줄에 있지 않으면 세미콜론이 필요합니다. 또한 $ IFS에는이 작업을위한 공간이 있어야합니다. –

+0

반복에 IFS에 따라 (단지 할당이 아닌) 나쁜 주주 (juju)가 잘못되어이 답변이 차선입니다. 줘서, 제 것이 너무 했어요. - zsh에서 테스트를하고 있었고, bash 이후로 수정되었습니다. –

6

내가 좋아하는 대답이 올바른 대답으로 받아 들여 졌으므로, 지금은 다른 주제로 옮겨 가겠습니다 : 개인 이익을 위해 IFS을 사용하는 방법. - P

IFS 변경이 자신의 서브 프로세스로 격리되도록 내가 괄호 안에 코드를 삽입 한
fruits="apple,orange,kiwifruit,dried mango" 
(IFS=, 
for fruit in $fruits; do 
    echo "$fruit" 
done) 

; 따라서 괄호로 묶인 섹션의 끝에서 IFS은 이전 값으로 되돌려집니다. :-)

+0

'fruits = (사과 오렌지 "키위 과일")'을 시도하면, bash는 "키위"와 "과일"을 루프 중에 별도의 엔티티로 나눕니다. for/in의 경우, IFS에 의해 화상을 입게됩니다. 그러나'echo $ {fruits [2]}는 옳은 일을합니다. – emk

+0

작동하는이 코드의 버전은 http://stackoverflow.com/questions/78592/what-is-a-good-equivalent-to-perl-lists-in-bash#78631을 참조하십시오. – emk

+0

의견에 감사드립니다. 결정된. –

관련 문제