2014-04-18 5 views
13

다음 코드를 수정하여 zsh에서 실행할 때 $things을 확장하고 한 번에 하나씩 반복하도록하려면 어떻게해야합니까?zsh에서 한 번에 한 단어 씩 반복 처리하는 방법

things="one two" 

for one_thing in $things; do 
    echo $one_thing 
done 

나는 출력이 원하는 :

one 
two 

그러나 위의 기록, 그것은 출력 :

one two 

가 (나는를 실행할 때 당신이 얻을 행동을 찾고 있어요 bash의 코드 위)

+1

'for' 루프의 목록 일 때'zsh'는'$ things'을 단어 분리하지 않는다는 뜻입니까? 루프의 몸체에 한 번만 들어가고 있습니까? 구성 스크립트를 통해 싸운 후 대답은 "예"입니다. 사용 가능한 쉘 목록에서'zsh'을 스크래치합니다. POSIX 쉘과 너무 비슷합니다. 나는 '정상적으로'작동하도록 구성 할 수있는 방법에 대해 생각하기 시작하기조차 힘듭니다. –

답변

23

Bourne 쉘과 호환되는 동작을 보려면옵션을 설정해야합니다:

setopt shwordsplit  # this can be unset by saying: unsetopt shwordsplit 
things="one two" 

for one_thing in $things; do 
    echo $one_thing 
done 

생산할 것 :

one 
two 

그러나, 예를 들어,

things=(one two) 

for one_thing in $things; do 
    echo $one_thing 
done 

또한 참조 할 수 있습니다, 단어 분할을 생산하는 배열을 사용하는 것이 좋습니다 ~까지 :

3.1: Why does $var where var="foo bar" not do what I expect?

+0

'shwordsplit'을 전역 적으로 설정하는 대신, '$ {= things}'를 가진 단일 매개 변수에'sh' 스타일의 단어 분리 (물론'IFS'를 사용)를 가능하게 할 수 있습니다. – chepner

+0

@chepner, 어떻게 생겼습니까? 나는'IFS = ''를 시도했다; $ {= things}의 one_thing에 대한; 하지만'잘못된 대체 '오류가 발생했습니다 –

+0

@RobBednark 왜 배열을 사용하지 않습니까? – devnull

4

당신이 단어 분할을 수행 할 z 변수 확장 플래그를 사용할 수있는 아래 man zshexpn이 다른 변수 플래그에 대한 자세한 읽기

things="one two" 

for one_thing in ${(z)things}; do 
    echo $one_thing 
done 

변수 "매개 변수 확장 플래그."

-1

bash의 내부 필드 분리 기호 (IFS)가 \ x20 (공백)이라고 가정 할 수 있습니다. 이는 다음 작업을 수행합니다.

#IFS=$'\x20' 
#things=(one two) #array 
things="one two" #string version 

for thing in ${things[@]} 
do 
    echo $thing 
done 

이 점을 염두에두면 여러 가지 방법으로 IFS를 조작 할 수 있습니다. 멀티 라인 문자열에서도.

관련 문제