zsh

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 

(मैं व्यवहार है कि आप जब चलाने के लिए देख रहा हूँ बैश में कोड के ऊपर)

+1

क्या इसका मतलब यह है कि 'zsh' शब्द' विभाजन 'शब्द नहीं है जब यह' लूप 'की सूची है? क्या यह सिर्फ एक बार लूप के शरीर में प्रवेश कर रहा है? उत्तर, कॉन्फ़िगरेशन स्क्रिप्ट के माध्यम से लड़ने के बाद, "हां" है। प्रयोग योग्य गोले की सूची से 'zsh' स्क्रैच करें; यह बहुत ही गैर-पॉज़िक्स-खोल जैसा है। मुझे यह सोचने के लिए भी परेशान नहीं किया जा सकता कि यह 'सामान्य' काम करने के लिए कॉन्फ़िगर करने योग्य कैसे हो सकता है। –

उत्तर

23

बॉर्न शैल के साथ संगत व्यवहार को देखने के लिए, आपको विकल्पसेट करना होगा:

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' सेट करने के बजाय, आप 'sh {-things}' के साथ एक पैरामीटर के लिए 'sh'-style शब्द विभाजन (निश्चित रूप से' IFS' का उपयोग करके) सक्षम कर सकते हैं। – chepner

+0

@chepner, यह कैसा दिखता है? मैंने 'आईएफएस = 'की कोशिश की; $ {= चीज़} में one_thing के लिए; do' लेकिन एक 'खराब प्रतिस्थापन' त्रुटि मिली –

+0

@RobBednark आप सरणी का उपयोग क्यों नहीं करते? – devnull

4

आप पर शब्द बंटवारे करने के लिए z चर विस्तार ध्वज का उपयोग कर सकते एक चर

things="one two" 

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

man zshexpn में इस और अन्य चर झंडे के बारे में और अधिक पढ़ें, के तहत "पैरामीटर विस्तार झंडे।"

-1

आप \ x20 (स्पेस) होने के लिए बैश पर आंतरिक फील्ड सेपरेटर (आईएफएस) मान सकते हैं। यह निम्न काम करता है:

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

for thing in ${things[@]} 
do 
    echo $thing 
done 
इस के साथ

मन में तुम सिर्फ भारतीय विदेश सेवा से छेड़छाड़ कई अलग अलग तरीकों में यह लागू कर सकते हैं; मल्टी-लाइन तारों पर भी।