सबसे पहले, मैं मानता हूं कि इसका उपयोग ls
केवल एक उदाहरण है। आप ls
किसी भी शेल के आउटपुट को पार्स नहीं कर सकते , क्योंकि यह अस्पष्ट है। पढ़ें कि अगर आपको यह खबर है तो आपको ls (1) के आउटपुट को पार्स नहीं करना चाहिए । किसी भी शेल में, फ़ाइलों की सूची प्राप्त करने के लिए, वाइल्डकार्ड्स का उपयोग करें, जैसे files=(*)
।
Zsh में, अन्य गोले की तरह, कमांड प्रतिस्थापन का परिणाम व्हॉट्सएप वर्णों में शब्दों में विभाजित होता है (अधिक सटीक रूप से, मूल्य के अनुसार IFS
)। (अन्य गोले के विपरीत, कमांड प्रतिस्थापन का परिणाम zsh में ग्लोबिंग के अधीन नहीं है।) इसलिए यदि ls
कमांड का आउटपुट है
hello world
wibble
तो files=($(ls))
सेट files
सरणी 3 तत्वों को रोकने के: hello
, world
और wibble
।
यदि कमांड प्रतिस्थापन डबल कोट्स में है, तो कोई विभाजन नहीं किया जाता है। आप पैरामीटर विस्तार झंडे के साथ कस्टम विभाजन कर सकते हैं । @
ध्वज का उपयोग यह इंगित करने के लिए करें कि विभाजन का परिणाम एक सरणी है (अजीब तरह से, आपको दोहरे उद्धरणों में विस्तार को रखने की आवश्यकता है, अर्थात "${(@)…}"
, भले ही दोहरे उद्धरण वाला स्ट्रिंग कई शब्दों तक विस्तारित हो जाएगा)। विभाजन के लिए, s
ध्वज का उपयोग करें , उदाहरण के "${(@s:,:)…}"
लिए अल्पविराम में विभाजित करने के लिए; f
झंडा केवल नई-पंक्तियों में विभाजित होता है।
files=("${(@f)$(ls)}")
ध्यान दें कि सामान्य for f in $files[@]
रूप से एक सरणी पर पुनरावृति करने का उचित तरीका है , क्योंकि $files
खाली तत्वों से स्ट्रिप्स (यहां, यह कोई फर्क नहीं पड़ता क्योंकि तत्व खाली नहीं होंगे)।
print $f
$f
एक स्विच के रूप में व्याख्या करता है अगर यह एक के साथ शुरू होता है -
और बैकस्लैश का विस्तार करता है $f
। उपयोग करें print -r -- $f
, या print -rn -- $f
यदि आप स्ट्रिंग के बाद एक नई पंक्ति नहीं जोड़ना चाहते हैं।