लूप के लिए बैश में "डू" कीवर्ड का उद्देश्य क्या है?


76

doबैश forलूप सिंटैक्स में कीवर्ड का उद्देश्य क्या है ? मेरे लिए, यह बेमानी लगता है।

for i in `seq 1 2`; do echo "hi"; done

सिंटैक्स ऐसा क्यों नहीं है?

for i in `seq 1 2`; echo "hi"; done

मुझे यकीन है कि यह एक उद्देश्य को पूरा करता है । मैं सिर्फ सीखना चाहता हूं।

जवाबों:


118

ध्यान दें कि सिंटेक्स बॉर्न शेल से विरासत में मिला है।

चर नाम के बाद, आपके पास या तो inतत्वों की सूची स्पष्ट रूप से दी जा सकती है, या doस्थितिगत मापदंडों पर लूप करने के लिए।

for i in 1 2 3
do
  echo "$i"
done

या

set 1 2 3
for i do
  echo "$i"
done

doदोनों मामलों में होने (भले ही यह पहले एक में सख्ती से आवश्यक नहीं है) एक अधिक सुसंगत वाक्य रचना के लिए बनाता है। यह भी while/ untilछोरों के अनुरूप है जहां doआवश्यक है।

while
  cmd1
  cmd2
do
  cmd3
  cmd4
done

आपको यह doबताने की आवश्यकता है कि हालत आदेशों की सूची कहां समाप्त होती है।

ध्यान दें कि बॉर्न शेल ने समर्थन नहीं किया for i; do। मानक के 2016 संस्करण तक वह सिंटैक्स भी POSIX नहीं था ( for i doहमेशा POSIX रहा है; संबंधित ऑस्टिन समूह बग देखें )।

zsh कुछ शॉर्टहैंड फॉर्म हैं जैसे:

for i in 1 2 3; echo $i
for i (1 2 3) echo $i
for ((i=1;i<=3;i++)) echo $i

या एक से अधिक चर के लिए समर्थन:

for i j (1 a 2 b) echo $i $j

(हालांकि आप उपयोग नहीं कर सकते inया doके स्थान पर चर नाम के रूप में jऊपर)।

शायद ही कभी दस्तावेज यहां तक कि अगर, सबसे बॉर्न की तरह गोले (बॉर्न, ksh, बैश, zsh, नहीं ashहै और न ही yash) भी समर्थन करते हैं:

for i in 1 2 3; { echo "$i";}

बॉर्न शेल, kshऔर zsh(लेकिन नहीं bash) भी समर्थन करते हैं:

for i { echo "$i"; }

जबकि bash, kshऔर zsh(लेकिन बॉर्न शेल नहीं) समर्थन:

for i; { echo "$i"; }

सभी (बॉर्न, bash, ksh, zsh) का समर्थन:

for i
{ echo "$i";}

ksh93, bash, zshका समर्थन:

for ((i=1;i<=3;i++)) { echo "$i"; }

2
हमेशा की तरह, पूर्ण और सही जवाब (zsh के लिए एक संदर्भ के साथ) के रूप में ...
Kiwy

2
यह किसी भी मामले में "सख्ती से आवश्यक" नहीं है for; आदेश को एक नई पंक्ति या अर्धविराम द्वारा समाप्त किया जा सकता है। यह if/ while(पूर्व के thenबजाए पूर्व do) के लिए थोड़ा अधिक समझ में आता है , लेकिन सिद्धांत रूप में वे इसे छोड़ सकते हैं और कई आदेशों के (दुर्लभ) उपयोग के लिए एक उपधारा या ब्रेस की आवश्यकता होती है। मुझे असली कारण पर संदेह है कि बॉर्न शेल ऐसा करता है क्योंकि ALGOL यह करता है, और हमें खुशी होनी चाहिए कि doneयह वर्तनी नहीं है od
रैंडम 832

4
@ Random832: ऐसा इसलिए है क्योंकि odपहले से ही ऑक्टल डंप प्रोग्राम के नाम के रूप में उपयोग किया जाता था।
user1024

8
नहीं है इतना यहाँ मुझे नहीं पता था। धन्यवाद!
हल्बी की दौड़ ऑर्बिट

1
@mirabilos, for i doBourne और POSIX है, लेकिन राख आधारित गोले IIRC के कुछ पुराने संस्करणों में काम नहीं करेगा। for i in "$@"यदि $IFSअंतरिक्ष वर्ण नहीं है, तो बॉर्न शेल में काम नहीं करेगा । for i<newline>doयदि आपको बहुत पुराने बीएसडी सिस्टमों पर विचार करने की आवश्यकता है तो वास्तव में सबसे अधिक पोर्टेबल है। विवरण के लिए देखें- ulm.de/~mascheck/various/bourne_args
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.