এমন কোনও মানক ইউনিক্স প্রোগ্রাম রয়েছে যা বিভিন্ন সংখ্যার সীমা প্রদান করে


22

আমি একটি পুরানো পাঠ্যপুস্তক থেকে শেল স্ক্রিপ্টিং শিখছি, এবং আমার কাছে মনে হচ্ছে এটি এমন একটি প্রোগ্রামের জন্য সত্যই উপযোগী হবে যেটি কেবল ফাঁকা স্থান দ্বারা সীমাবদ্ধ সংখ্যার একটি স্ট্রিং ফেরত দেয়

$ 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লুপের মধ্যে গুরুত্বপূর্ণ নয় — বা এমন কোনও সাধারণ কমান্ড যা যুক্তিগুলি বিভক্ত করে — যদি না আপনি আইএফএসকে আলাদাভাবে সেট করেন set
slhck

1
এই প্রশ্নের ওপিকে "স্ট্যান্ডার্ড ইউনিক্স প্রোগ্রাম" এর অর্থ কী তা নির্ধারণ করা উচিত।
ডেভিড রিভারস

1
@ ডেভিডাইভার্স যেমন ইতিমধ্যে মন্তব্য করেছে, আপনাকে শিরোনামে এবং প্রশ্নটি আপনার ফোকাসটি লিনাক্স বিতরণগুলির উপর থাকা উচিত। আপনি গৃহীত উত্তরটি এমন একটি সরঞ্জামের প্রস্তাব দেয় যা মানক ইউনিক্স প্রোগ্রাম নয়। বেশ কয়েকটি ইউনিক্সের অভাব রয়েছে seqকারণ এটি পসিক্স দ্বারা নির্দিষ্ট করা হয়নি।
jlliagre

উত্তর:


79

seq কোর্টিলের অংশ is

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প্রস্থ qualize করতে। : এবং আপনি একটি বৃদ্ধি প্রদান করতে পারেন seq -w -s ", " 0 5 20ফলাফল 00, 05, 10, 15, 20
স্কাই

2
@ সাইক আপনি বোঝাতে চেয়েছেন seq?
কার্লোস ক্যাম্পডার্স

@ কার্লোস ক্যাম্পডারস অবশ্যই, দুর্ভাগ্যক্রমে আমি আর আমার মন্তব্য সম্পাদনা করতে পারছি না।
স্কাই

3
seq 10 20যোগ করার উপযুক্ত একটি সাধারণ উদাহরণও হতে পারে;)
ডের হচস্টাপলার

@scai যে দুর্দান্ত, আমি আজ নতুন কিছু শিখেছি :) সত্যি বলতে, আমার মনে হয় আপনার এটি আলাদা, আরও বিশদ উত্তর হিসাবে যুক্ত করা উচিত!
টিম গ্রোনেভেল্ড

33

বাশ যথেষ্ট হবে?

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

ব্রেস প্রসারণ দিয়ে আপনি অনেক কিছু করতে পারেন । বাশ 4 এছাড়াও প্যাডেড রেঞ্জগুলি সমর্থন করে, যেমন {01..20}

দ্রষ্টব্য যে বাশকে বহনযোগ্য হিসাবে বিবেচনা করা হয় না , এবং মানক ইউনিক্স ইউটিলিটি নয়। যদিও আপনি নিরাপদে ধরে নিতে পারেন যে এটি বেশিরভাগ আধুনিক লিনাক্সে ইনস্টল করা আছে, তবে কোনও স্ক্রিপ্টে এটি ব্যবহার করবেন না যা আপনি সব ধরণের ইউনিক্সের মতো মেশিনে চালানোর পরিকল্পনা করছেন।


13
@Maksim: যদিও আমি এই বক্রবন্ধনী সম্প্রসারণ পছন্দ করেন, এছাড়াও আছে একটি টিপিক্যাল ইউনিক্স সরঞ্জাম (খুব সামান্য না, কিন্তু যে ভাল না) যে জন্য আছে: seq। ব্যবহার আপনার উদাহরণ হিসাবে হল: seq -s " " 10 20-sকারণ ডিফল্টরূপে মান দ্বারা বিভক্ত করা হয় প্যারামিটার হয়, প্রয়োজনীয় \n
এমপি

হ্যাঁ, আপনি যে কঠোরভাবে তা ব্যাখ্যা করেছেন তার উপর নির্ভর করে বাশ "মানক" নয়। আমি হ্যান্ডেল করা সহজভাবে পেয়েছি এবং এটির জন্য অতিরিক্ত কলের প্রয়োজন নেই।
slhck

1
@ এমপি, নোট করুন এটি seqএকটি জিএনইউ ইউটিলিটি, এবং তাই কোনও "স্ট্যান্ডার্ড ইউনিক্স প্রোগ্রাম" নয়
গ্লেন জ্যাকম্যান

5
@glennjackman বিকাশকারী.এপলল / লাইব্রেরি / ম্যাক / ডকুমেন্টেশন / ডারউইন / রেফারেন্স / এর মতে ... "বেল ল্যাবস থেকে প্ল্যান 9-এ সিক কমান্ডটি প্রথম উপস্থিত হয়েছিল। নেট সেক্টর কমান্ড নেটবিএসডি ৩.০ এ উপস্থিত হয়েছিল এবং ফ্রিবিএসডি ৯.০ এ পোর্ট করে এই কমান্ডটি বেল ল্যাবস এবং জিএনইউ কোর ইউটিলিটিগুলি থেকে প্ল্যান 9 এ একই নামের কমান্ডের উপর ভিত্তি করে তৈরি হয়েছিল। জিএনইউ সেক কমান্ডটি প্রথম 1.13 শেল ইউটিলিটি রিলিজে উপস্থিত হয়েছিল। "
200_সাক্সেস

এছাড়াও নোট করুন যে আপনি করতে পারেন for i in {001..010}; ... ; doneএবং এটি শূন্য প্যাড করবে 3 টি সংখ্যা।
ভোল্টাইলড্রিম

9

যদি আপনি কঠোরভাবে পোর্টেবল কিছু চান (যেমন এটি পশিক্স দ্বারা নির্দিষ্ট না করা নির্দিষ্ট ব্যাশ এক্সটেনশন বা কমান্ডের উপর নির্ভর করে না)

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

1
আপনার যোগ করার দরকার নেই /dev/nullনাকি < /dev/null?
স্কট

1
@ স্কট না, এটি প্রয়োজনীয় নয়। পসিক্স স্ট্যান্ডার্ড ( 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বিএসডি Dতিহ্যের কারণে।

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.