Zsh और बैश में छोरों के लिए


57

मैंने देखा है कि zsh में छोरों के निर्माण के दो वैकल्पिक तरीके हैं :

  1. for x (1 2 3); do echo $x; done
  2. for x in 1 2 3; do echo $x; done

वे दोनों प्रिंट करते हैं:

1
2
3

मेरा सवाल है, दो वाक्यविन्यास क्यों? क्या उनमें से प्रत्येक में $xएक अलग प्रकार की वस्तु के माध्यम से पुनरावृति होती है ?

क्या बैश एक समान अंतर बनाता है?

परिशिष्ट:

निम्न कार्य क्यों करता है: "

#!/bin/zsh
a=1
b=2
c=5    

d=(a b c)    
for x in $d; do print $x;done

लेकिन यह एक नहीं है ?:

#!/bin/zsh
a=1
b=2
c=5

d=(a b c)    
# It complains with "parse error near `$d'"
for x $d; do print $x;done 

5
उदाहरण के लिए कि "काम नहीं करता है", जो पाश के लिए एक csh शैली है, आप कोष्ठक को याद कर रहे हैं। for x ($d); do print $x; doneकाम करेगा, और यह आपके प्रश्न की शुरुआत में पहले सिंटैक्स से मेल खाएगा।
टिम कैनेडी

1
यह SO पागल है - कि वे दो कथन - वास्तव में दोनों "समान कार्य" नहीं करते हैं। मैं सचमुच इसके चारों ओर अपना सिर प्राप्त नहीं कर सकता! मुझे उन शेल डिजाइनरों में से कुछ को धूम्रपान करने की आवश्यकता है जो 'धूम्रपान कर रहे थे, दिन में वापस, योग्य।
एलेक्स ग्रे

सावधान, शुरू में दिखाई देने की तुलना में इस कहानी में अधिक है। मैं आपको अपना उत्तर जाँचने के लिए आमंत्रित करता हूँ।
जस्सोनलहार्ड

मैंने यह नहीं देखा कि किसी और ने इसका उल्लेख किया है, लेकिन दोनों ही रूपों में क्या करें / किए जाने की अनुमति है: for i ({0..4..2}) for j ({a..c}) echo "($i,$j)"= {0,2,4}x{a,b,c}। अर्धविराम सबसे बाहरी लूप पर लागू होते हैं और अंतरनिर्देश पर पुनर्निर्देशन लागू होता है, और यदि आपको इसे बदलने की आवश्यकता है, तो आपको केवल ब्रेस की आवश्यकता है: for i ({0..4..2}) { for j ({a..c}) echo "($i,$j)" } | cat -n= {1,...,9}*({0,2,4}x{a,b,c})। बेशक आप zsh विस्तार के साथ छोरों को जोड़ सकते हैं:for i ("("{0..4..2}","{a..c}")") echo $i
जॉन पी

जवाबों:


58

कई प्रकार के जटिल कमांड जैसे लूप्स को zsh में वैकल्पिक रूप दिया गया है। ये रूप ज्यादातर सी शेल से प्रेरित हैं , जो काफी सामान्य था जब zsh युवा था लेकिन अब गायब हो गया है। ये वैकल्पिक रूप बिल्कुल सामान्य रूपों की तरह काम करते हैं, वे सिर्फ एक अलग वाक्यविन्यास हैं। वे थोड़े छोटे हैं, लेकिन कम स्पष्ट हैं।

forकमांड के लिए मानक फॉर्म है for x in 1 2 3; do echo $x; done, और कमांड के लिए मानक फॉर्म whileहै while test …; do somecommand; done। Ksh, bash और zsh का एक वैकल्पिक रूप है for: for ((i = 0; i < 42; i++)); do somecommand; doneजो forपूर्णांक बनाने के लिए पास्कल या C जैसी भाषाओं के छोरों की नकल करता है । अन्य विदेशी रूप जो कि zsh में मौजूद हैं, zsh के लिए विशिष्ट हैं (लेकिन अक्सर csh से प्रेरित होते हैं)।


बहुत बहुत धन्यवाद @Guilles मैं अभी भी थोड़ा उलझन में हूँ। कौन सा रूप विशिष्ट है zsh? इसके अलावा, मैंने अपने ओपी के अंत में एक उदाहरण जोड़ा है जहां मैं यह नहीं जान सकता कि वाक्य रचनाओं के बीच अनुवाद कैसे किया जाए। यदि अंतर सिर्फ वाक्यविन्यास है, तो मुझे इसे बनाने के लिए परिशिष्ट में दूसरी स्क्रिप्ट को कैसे ठीक करना चाहिए?
एमिलियो वाज़क्वेज़-रीना

3
@intrpc मेरा अद्यतन उत्तर देखें। अपने अंतिम उदाहरण के लिए, यह काम नहीं करता है क्योंकि आपने लिखा था for x $dऔर zsh को inया (जहां आपने लिखा था, की उम्मीद है $d। विराम चिह्न और आरक्षित शब्द एक चर विस्तार से नहीं आ सकते हैं, चर विस्तार पर शुरू होने से पहले उन्हें पार्स किया जाना चाहिए।
गाइल्स का SO- दुष्ट होना बंद हो '

@intrpc दोनों zsh विशिष्ट हैं। zsh को विशेष रूप से बोर्न, कॉर्न और सी-शेल सिंटैक्स दोनों का समर्थन करने के लिए डिज़ाइन किया गया था, क्योंकि यह तीनों का एक संकर है।
टिम कैनेडी

1
@pseyfert यह काम करता है, लेकिन मेरे द्वारा दिखाए जाने वाले रूपों पर इसका कोई लाभ नहीं है: यह for (( … ))फॉर्म की तुलना में कम पोर्टेबल है और 3 बड़ी होने पर बहुत अधिक मेमोरी का उपयोग करता है।
गिल्स एसओ- बुराई को रोकना '

1
@ अल्फ़ा_989 श-समान सिंटैक्स में, आपको doबाद की आवश्यकता है ));। Zsh भी एक और वाक्यविन्यास को स्वीकार करता है for ((…)); COMMANDजहां COMMANDएक एकल कमांड है। इसलिए यह स्वीकार करता है for ((i = 1; i<100; i++)); ghi show $i | grep "log"। जब यह इसके doneबाद देखता है , तो यह शिकायत करता है क्योंकि doअंत नहीं था । मैनुअल में "कॉम्प्लेक्स कमांड के लिए वैकल्पिक रूप" देखें ।
गिल्स एसओ- बुराई को रोकें '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.