कैसे बैश में कदम एन के साथ एक सीमा का उत्पादन करने के लिए? (वेतन वृद्धि के साथ संख्याओं का एक क्रम उत्पन्न करें)


143

बैश में एक सीमा पर पुनरावृति करने का तरीका है

for i in {0..10}; do echo $i; done

एक कदम के साथ अनुक्रम पर पुनरावृत्ति के लिए वाक्यविन्यास क्या होगा? कहते हैं, मैं उपरोक्त उदाहरण में केवल संख्या प्राप्त करना चाहूंगा।


यहां तक ​​कि संख्या, मैं 2. से गुणा करता हूं: पी
जॉय रॉबर्ट

गुणन बल्कि बदसूरत है, मुझे कहना चाहिए
साइलेंटगॉस्ट

2
@Omnifarious मुझे इतना यकीन नहीं होगा। उदाहरण के लिए, OS X अभी भी 3.2 के साथ आता है। मैं कहूंगा कि सी-स्टाइल लूप को स्वीकार किया जाना चाहिए।
एली कोरविगो

जवाबों:


195

मैं करूंगा

for i in `seq 0 2 10`; do echo $i; done

(हालांकि बेशक seq 0 2 10अपने दम पर एक ही उत्पादन का उत्पादन होगा)।

ध्यान दें कि seqफ्लोटिंग-पॉइंट नंबर (जैसे seq .5 .25 3.5) की अनुमति देता है , लेकिन बैश का ब्रेस विस्तार केवल पूर्णांक की अनुमति देता है।


4
मुझे लगता है कि डाउनवोट आपके उत्तर के कारण 'श' के लिए सामान्य है, और 'बैश' के लिए विशिष्ट नहीं होने के कारण मुझे खतरा होगा। शुद्ध बैश दृष्टिकोण {स्टार्ट एंड स्टेप} थोड़ा बेहतर प्रदर्शन करता है। बिजीबॉक्स जैसे पुराने या छोटे-मेमोरी सिस्टम पर पुराने 'seq' पद्धति का काम। मैंने आपके और द बोन्साई के उत्तर दोनों को उखाड़ फेंका। :)
स्कॉट प्रिव

6
$ बैक करने के लिए (...) को प्राथमिकता दें। Backquotes घोंसला नहीं करते हैं।
सर्वव्यापी

seq 1000000 1000010 केवल तैरता है, वास्तव में - इसे पूर्णांक बनाने का कोई तरीका नहीं है! ब्रेस विस्तार का काम करता है।
हमीज ने

112

बैश 4 के ब्रेस विस्तार में एक चरण विशेषता है:

for {0..10..2}; do
  ..
done

कोई बात नहीं अगर बैश 2/3 (लूप के लिए सी-स्टाइल, ऊपर उत्तर देखें) या बैश 4, मैं 'seq' कमांड पर कुछ भी पसंद करूंगा।


1
और btw, क्या आपको पता है कि bash4 किसी भी प्रमुख OS पर डिफ़ॉल्ट है?
साइलेंटगॉस्ट

3
Bash4 अभी भी मुख्यधारा नहीं है, नहीं। Seq क्यों नहीं? खैर, आइए इसे आईआरसी चैनल # बश में बॉट के शब्दों के साथ कहें: "seq (1) एक अत्यधिक नॉनस्टैंडर्ड एक्सटर्नल कमांड है, जिसका इस्तेमाल मूर्खतापूर्ण लिनक्स हॉटोस में 10 तक गिनती के लिए किया जाता है।"
बोनसाई

मेरी समझ यह है कि seq कोरयूटिल्स का एक हिस्सा है। इसके बारे में गैर-मानक क्या है? तर्क? आपकी सहायता के लिए धन्यवाद।
साइलेंटगॉस्ट

4
ये तर्क आपके लिए गणना कर सकते हैं या नहीं भी कर सकते हैं: * जीएनयू कोरुटिल्स के बिना पर्याप्त सिस्टम हैं (लेकिन बैश स्थापित) * आप एक अनावश्यक बाहरी प्रक्रिया बनाते हैं * आप इस विचार पर भरोसा करते हैं कि सभी 'seq' वही करते हैं जो आपका 'seq' है * ISO द्वारा मानकीकृत नहीं
TheBonsai

3
@becko यदि चर में चरण संग्रहीत है i, तो आप ऐसा नहीं कर सकते for {0..10..${i}}.. यह विफल रहता है।
नेहल जे वानी

72

एक अतिरिक्त प्रक्रिया के बिना शुद्ध बैश:

for (( COUNTER=0; COUNTER<=10; COUNTER+=2 )); do
    echo $COUNTER
done

10
+1 क्योंकि चरण को एक चर द्वारा भी बदला जा सकता है।
नेहल जे वानी

1
मुझे लगता है कि यह वास्तव में वही है जो ज्यादातर लोग चाहते हैं - एक निर्धारित कदम मूल्य के साथ एक पाश करने का एक सरल तरीका। यह सभी seq आधारित उत्तरों की तुलना में सरल लगता है, और Bash4 ब्रेस विस्तार की तुलना में एक स्पष्ट सिंटैक्स है, और ऐसा लगता है कि यह चर के लिए अनुमति देगा (मैंने कोशिश नहीं की है, लेकिन सिंटैक्स निश्चित रूप से सुझाव देता है कि)।
19 को टोबेलारोनी

@Bonsai के उत्तर के विपरीत, बैश 3 में काम करता है।
19

यह चर को भी हल करता है, (i = "$ पहले"; मैं <= "$ अंतिम"; मैं + = "$ कदम"))। घुंघराले ब्रेसिज़ और seq के साथ इतना आसान नहीं है।
Blaa_Thor

20
#!/bin/bash
for i in $(seq 1 2 10)
do
   echo "skip by 2 value $i"
done

seq एक Linux कमांड है। यह Mac OS X या FreeBSD पर उपलब्ध नहीं होगा।
डेरेकसन

5
FWIW seq मेरे मानक OS X Mavericks में उपलब्ध है 10.9.1
मार्क सेटेल

मैंने कुछ अन्य सिंटेक्स की कोशिश की है, लेकिन वह केवल मेरे लिए थोड़े CentOS पर काम कर रहा है। @z - ने मेरा दिन बचा लिया है: D
m3nda

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.