क्या कोई मानक यूनिक्स कार्यक्रम है जो संख्याओं की एक सीमा लौटाता है


22

Im एक पुरानी पाठ्यपुस्तक से शेल स्क्रिप्टिंग सीख रहा है, और मुझे ऐसा लगता है कि यह वास्तव में उपयोगी होगा एक प्रोग्राम है जो सिर्फ रिक्त स्थान द्वारा सीमांकित संख्याओं की एक स्ट्रिंग देता है जैसे कुछ

$ range 10 20
10 11 12 13 14 15 16 17 18 19 20

फिर, यदि आप एक शेल स्क्रिप्ट कर रहे हैं तो आप कर सकते हैं

for i in `range 10 20`; do some stuff with numbers in that range;done

क्या ऐसा कुछ मौजूद है, या क्या मुझे इसे स्वयं लिखने की आवश्यकता है?


जब आप "यूनिक्स" कहते हैं, तो क्या आप वास्तव में लिनक्स का मतलब है? या क्या आप वास्तव में अन्य प्रणालियों (सोलारिस, बीएसडी, ...) के लिए पोर्टेबिलिटी में रुचि रखते हैं?
ग्लेन जैकमैन

2
एस / रेंज / सेक - की जगह rangeके साथ seqअपने उदाहरण में। डिफ़ॉल्ट विभाजक न्यूलाइन है, जिसमें रिक्त स्थान हैं:seq -s " " 10 20
n611x007

@naxa चाहे स्पेस हो या न्यूलाइन्स forलूप में कोई फर्क नहीं पड़ता - या यहां तक ​​कि कोई भी सामान्य कमांड जो तर्कों को विभाजित करता है - जब तक कि आपने आईएफएस को अलग तरीके से सेट नहीं किया है।
slhck

1
यह प्रश्न परिभाषित करना चाहिए कि ओपी के लिए "मानक यूनिक्स कार्यक्रम" क्या है।
डेविड रिवर

1
जैसा कि @DavidRivers ने पहले ही टिप्पणी की थी, आपको शीर्षक में बताना चाहिए और आपका ध्यान लिनक्स वितरण पर है। आपके द्वारा स्वीकार किया गया उत्तर एक उपकरण का सुझाव देता है जो एक मानक यूनिक्स कार्यक्रम नहीं है। कई यूनिक्स की कमी है seqक्योंकि यह POSIX द्वारा निर्दिष्ट नहीं है।
jlliagre

जवाबों:


79

seq कोरुटिल्स का हिस्सा है।

for i in $( seq 1 2 11 ) ; do echo $i ; done

आउटपुट:

1
3
5
7
9
11

यदि आप केवल 2 तर्क प्रदान करते हैं seq, तो वेतन वृद्धि 1 है:

$ seq 4 9
4
5
6
7
8
9

2
sedइसमें -sविभाजक सेट करने या -wचौड़ाई प्राप्त करने के लिए अच्छे विकल्प भी हैं । : और आप एक वेतन वृद्धि प्रदान कर सकते हैं seq -w -s ", " 0 5 20में परिणाम 00, 05, 10, 15, 20
scai

2
@साई आपका मतलब है seq?
कार्लोस कैंपडरो

@ CarlosCampderrós बेशक, दुर्भाग्य से मैं अपनी टिप्पणी संपादित नहीं कर सकता।
scai

3
seq 10 20जोड़ने के लायक भी एक सरल उदाहरण हो सकता है;)
डेर होकस्टाप्लर

@साई जो भयानक है, मैंने आज कुछ नया सीखा :) ईमानदार होने के लिए, मुझे लगता है कि आपको एक अलग, अधिक विस्तृत उत्तर के रूप में जोड़ना चाहिए!
टिम ग्रिनेवल्ड

33

बैश पर्याप्त होगा?

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

आप ब्रेस विस्तार के साथ बहुत सी चीजें कर सकते हैं । बैश 4 भी गद्देदार श्रेणियों का समर्थन करता है, जैसे {01..20}

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


13
@ माक्सिम: हालाँकि मैं भी इस ब्रेस विस्तार को पसंद करता हूं, लेकिन इसके लिए एक विशिष्ट Un * x टूल भी है (बहुत कम करें, लेकिन यह अच्छी तरह से करें) seq:। उपयोग अपने उदाहरण के रूप में है: seq -s " " 10 20-sक्योंकि डिफ़ॉल्ट रूप से मूल्यों से अलग होते हैं पैरामीटर, के लिए आवश्यक है \n
शाम

हाँ, बैश "मानक" पर निर्भर नहीं करता है कि आप कितनी सख्त व्याख्या करते हैं। मुझे अभी इसे संभालना आसान है और इसके लिए अतिरिक्त कॉल की आवश्यकता नहीं है।
slhck

1
@ नमस्कार, ध्यान दें कि seqएक GNU उपयोगिता है, और इसलिए "मानक यूनिक्स कार्यक्रम" नहीं है
ग्लेन जैकमैन

5
@glennjackman के अनुसार developer.apple.com/library/Mac/documentation/Darwin/Reference/... ... "पहले बेल लेबोरेटरीज की योजना 9 में दिखाई दिया। एक seq आदेश NetBSD 3.0 में दिखाई दिया, और FreeBSD 9.0 पर वापस पोर्ट seq आदेश यह कमांड बेल लैब्स और जीएनयू कोर यूटिलिटीज से प्लान 9 में एक ही नाम के कमांड पर आधारित था। जीएनयू सीक कमांड पहली बार 1.13 शेल यूटिलिटीज रिलीज में दिखाई दिया। "
२००

यह भी ध्यान दें कि आप कर सकते हैं for i in {001..010}; ... ; doneऔर यह संख्या को 3 अंकों तक शून्य कर देगा।
VolatileDream

9

यदि आप कुछ सख्ती से पोर्टेबल चाहते हैं (यानी जो विशिष्ट bash एक्सटेंशन या POSIX द्वारा निर्दिष्ट कमांड पर निर्भर नहीं करता है)

awk 'BEGIN {for(i=10;i<=20;i++) printf "%d ",i; print}'

1
क्या आपको इसे जोड़ने /dev/nullया < /dev/nullकरने की आवश्यकता नहीं है?
स्कॉट

1
@ नहीं, यह आवश्यक नहीं है। POSIX मानक ( pubs.opengroup.org/onlinepubs/9699919799/utilities/… ) निर्दिष्ट करता है:If the awk program contains no actions and no patterns, but is otherwise a valid awk program, standard input and any file operands shall not be read and awk shall exit with a return status of zero.
jlliagre

6

10.7 से पहले seqमैक ओएस एक्स पर नहीं था , लेकिन jot, बीएसडी विरासत के कारण।

jot -- print sequential or random data

...

HISTORY
    The jot utility first appeared in 4.2BSD

उदाहरण:

$ jot - 1 3
1
2
3

2

एक forलूप का उपयोग करें

for ((i = 10; i <= 20; ++i)); do
    printf '%d\n' "$i"
done

2

आप उपयोग कर सकते हैं seq, या यदि आपके पास ऐसा नहीं है, तो आप इसे स्वयं लिख सकते हैं:

#!/bin/bash
[ $# -ge 1 ] || { echo "Usage: seq Number [ Number ]" 1>&2 ; exit 1; }
[ $# -eq 1 ] && { [ $1 -gt 1 ] && ./seq $(($1 - 1)) ; echo $1 ; }
[ $# -eq 2 ] && { [ $(($2 - $1)) -gt 0 ] && ./seq $1 $(($2 - 1)) ; echo $2 ; }

उपयोग:

$ ./seq 3
1
2
3

या:

$ ./seq 3 7
3
4
5
6
7

1

पूर्णता के लिए यहां कुछ ऐसा है जो यूनिक्स के कुछ पुराने वेरिएंट के साथ काम करेगा (जब तक कि वे पर्ल स्थापित हैं)। वास्तव में सुरुचिपूर्ण नहीं है।

for I in $(perl -e 'print join("\n", 1..10)'); do something with $I; done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.