कमांड लाइन में लूप के लिए कैसे करें?


22

चलो एक सरल लेते हैं for loop

#!/bin/bash

for i in `seq 1 10`;
do
    echo $i
done

बाश स्क्रिप्ट में AFAIK अर्धविराम समकालिक रूप से वर्तमान कमांड निष्पादित करता है और फिर अगले एक पर जाता है। एंटर दबाने पर शाब्दिक रूप से वही होता है सिवाय इसके कि आप निम्न कमांड को दर्ज करने की अनुमति नहीं देते, बफर को तुरंत फ्लश कर देते हैं।

तो शेल निम्न पंक्ति की व्याख्या क्यों नहीं कर सकता है

for i in `seq 1 10`; do; echo $i; done

यह for loopवास्तव में कैसे काम करता है ?

जवाबों:


16

मैनुअल पेज forसे एक लूप का सिंटैक्स bashहै

for name [ [ in [ word ... ] ] ; ] do list ; done

अर्धविराम को गाड़ी के रिटर्न के साथ प्रतिस्थापित किया जा सकता है, जैसा कि bashमैनुअल पेज में कहीं और उल्लेख किया गया है : "एक या एक से अधिक नए क्रमों का एक क्रम एक अर्धविराम के बजाय आदेशों को सीमांकित करने के लिए एक सूची में दिखाई दे सकता है।"

हालांकि, रिवर्स सच नहीं है; आप मनमाने ढंग से अर्धविराम वाले नए समाचारों को प्रतिस्थापित नहीं कर सकते। जब तक आप उपरोक्त वाक्यविन्यास नियमों का पालन करते हैं, तब तक आपकी बहुस्तरीय स्क्रिप्ट को एक ही लाइन में बदला जा सकता है do:

for i in `seq 1 10`; do echo $i; done

2
अंतिम स्क्रिप्ट गलत है, जैसा कि @ dr01 ने बताया है, आपको अर्धविराम को बाद में निकालने की आवश्यकता है do
जेक

1
@ जेक, यह भी कहता है कि आप अर्धविराम को अवश्य हटा दें do। इसके अलावा, यह उत्तर बताता है कि आपको `करने 'के बाद अर्धविराम को क्यों हटाना चाहिए।
user4556274

क्या होगा अगर $iएक फ़ाइल नाम का हिस्सा होने की आवश्यकता है? क्या इसे दोहरे उद्धरण चिह्नों की आवश्यकता है?
बेनामी

18

अर्धविराम के बाद doएक त्रुटि है और यह नहीं होना चाहिए।

निम्नलिखित सही ढंग से काम करता है:

for i in `seq 1 10`; do echo $i; done 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.