লুপ সিনট্যাক্স "জন্য" শেল স্ক্রিপ্ট


190

আমি কাজ করতে নিম্নলিখিত অর্জন করেছেন:

for i in {2..10}
do
    echo "output: $i"
done

এটা তোলে লাইনের একটি গুচ্ছ উত্পাদন করে output: 2, output: 3, ইত্যাদি।

তবে, নিম্নলিখিতগুলি চালনার চেষ্টা করছেন:

max=10
for i in {2..$max}
do
    echo "$i"
done

নিম্নলিখিত উত্পাদন করে:

output: {2..10}

এটি সংকলকটি কীভাবে উপলব্ধি করতে পারি যে এটি অ্যারের অন্য প্রান্ত হিসাবে সর্বাধিক, এবং কোনও স্ট্রিংয়ের অংশ নয়?


2
আপনি কোন সিস্টেম এবং শেল ব্যবহার করছেন? কোন ধরণের গোফি সিস্টেমের শ বা বাশ রয়েছে, তবে সিক, কোর্টিল নেই?
হোসনেম

11
ফ্রিবিএসডি করে না।
নিটেচে-জৌ

echo "$iহওয়া উচিত echo "$i"- যদিও সমস্যাটি ঠিক করবে না।
ডেভ জার্ভিস

ক্ষুদ্র শৈলী নিট: আমি সাধারণত দেখতে doএবং thenহিসাবে একই লাইনে কীওয়ার্ড forএবং ifযথাক্রমে। উদাহরণস্বরূপ,for i in {2..10}; do
একটি প্রদত্ত নার্দ

উত্তর:


234

ব্রেস প্রসারণ, exp x..y other অন্যান্য বিস্তারের আগে সঞ্চালিত হয়, সুতরাং আপনি পরিবর্তনশীল দৈর্ঘ্যের ক্রমগুলির জন্য এটি ব্যবহার করতে পারবেন না।

পরিবর্তে, ব্যবহারকারীর উপস্থাপিত বক্তব্যseq 2 $max হিসাবে পদ্ধতিটি ব্যবহার করুন ।

সুতরাং, আপনার উদাহরণের জন্য এটি হবে:

max=10
for i in `seq 2 $max`
do
    echo "$i"
done

বাহ্যিক কমান্ড যেমন seqলুপের জন্য সংখ্যা গণনা এবং বৃদ্ধি হিসাবে ব্যবহার করার কোনও ভাল কারণ নেই , সুতরাং এটি ব্যবহার করা এড়াতে প্রস্তাব দেওয়া হচ্ছে seq। এই কমান্ডটি পুরানো বাশের সাথে সামঞ্জস্য করার জন্য রেখে দেওয়া হয়েছে। অন্তর্নির্মিত কমান্ডগুলি যথেষ্ট দ্রুত। for (( EXP1; EXP2; EXP3 )) ...
মিলার

13
@ মিলার for (( ... ))সিনট্যাক্সটি পসিক্স নয় এবং এর অর্থ হল এটি আলপাইন লিনাক্সের মতো জিনিসগুলির বাক্স থেকে বেরিয়ে আসবে না। seqআছে।
ওয়ার্নাইট

@ ওয়ার্নাইট কেবল আলপাইন লিনাক্স নয়; #!/bin/shডেবিয়ান / উবুন্টুতে ড্যাশ।
ফ্রাঙ্কলিন ইউ

72

এর গাণিতিক-এক্সপ্রেশন সংস্করণটি ব্যবহার করে দেখুন for:

max=10
for (( i=2; i <= $max; ++i ))
do
    echo "$i"
done

এটি ব্যাশের বেশিরভাগ সংস্করণে পাওয়া যায় এবং এটি বোর্ন শেল (sh) এর সাথেও সামঞ্জস্যপূর্ণ হওয়া উচিত।


1
@ ফ্লো: এইচএম, আমি এটি বেশ কয়েকটি সিস্টেমে (লিনাক্স এবং বিএসডি ভিত্তিক) # এর সাথে চেষ্টা করেছিলাম! বাশের অধীনে এবং বিশেষত / বিন / শ এর অধীন অন্তর্ভুক্ত, এখনও কাজ করেছে। শ এর সংস্করণ হতে পারে? আপনি কিছু পুরানো ইউনিক্সে আছেন?
সিস্টেম PAUSE

8
খুব কম সিস্টেমে একটি ডেডিকেটেড থাকে sh, পরিবর্তে এটি অন্য শেলের সাথে একটি লিঙ্ক তৈরি করে। আদর্শভাবে, এই জাতীয় শেলটি কেবল পসিক্স স্ট্যান্ডার্ডের সেই বৈশিষ্ট্যগুলিকে সমর্থন shকরবে , কিন্তু ডিফল্টরূপে তাদের কিছু অতিরিক্ত বৈশিষ্ট্যগুলি দিয়ে দেওয়া উচিত। লুপের জন্য সি-স্টাইল কোনও পসিক্স বৈশিষ্ট্য নয়, তবে প্রকৃত শেল দ্বারা মোডে থাকতে পারে । sh
চিপনার

27

নিজেই লুপটি পদক্ষেপ করুন:

i = 0
সর্বোচ্চ = 10
যখন [$ i -lt $ সর্বোচ্চ]
করা
    প্রতিধ্বনি "আউটপুট: $ i"
    সত্য $ ((আমি ++))
সম্পন্ন

আপনার যদি পুরোপুরি পসিক্স না হয়, আপনি লুপের জন্য পাটিগণিতটি ব্যবহার করতে পারেন :

সর্বোচ্চ = 10
(i = 0; i <সর্বোচ্চ; i ++)) এর জন্য; ইকো করুন "আউটপুট: $ i"; সম্পন্ন

অথবা বিএসডি সিস্টেমে জট (1) ব্যবহার করুন:

আমি $ এ (জোট 0 10); ইকো করুন "আউটপুট: $ i"; সম্পন্ন

3
true $(( i++ ))সব ক্ষেত্রে কাজ করে না, তাই বেশিরভাগ পোর্টেবল হবে true $((i=i+1))
ফ্লো

আধা কোলোন "এর জন্য ((i = 0; i <সর্বোচ্চ; i ++)) আসা উচিত নয়;"
লোগান

9

এটি করার একাধিক উপায় রয়েছে।

max=10
for i in `eval "echo {2..$max}"`
do
    echo "$i"
done

7
একটি সুরক্ষা ঝুঁকি, যেহেতু আপনি সেট করা কোনও কিছুরeval মূল্যায়ন করবে । বিবেচনা করুন , তারপরে আরও ধ্বংসাত্মক কিছু দিয়ে প্রতিস্থাপন করুন । maxmax="2}; echo ha; #"echo ha
চিপনার

6
(এস) তিনি সর্বোচ্চ 10 এ সেট করেছেন No কোনও ঝুঁকি নেই।
কনরাড মেয়ার

9

যদি seqআপনার সিস্টেমে কমান্ডটি উপলব্ধ থাকে:

for i in `seq 2 $max`
do
  echo "output: $i"
done

যদি তা না হয় তবে দরিদ্র ব্যক্তির seqসাথে এটি ব্যবহার করুন perl:

seq=`perl -e "\$,=' ';print 2..$max"`
for i in $seq
do
  echo "output: $i"
done

সেই উদ্ধৃতি চিহ্নগুলি দেখুন।


আমি কেবল এটি যাচাই করেছি; এটা মনে হয় না যে এটি।
ekkanal

5

এটি একটি উপায়:
বাশ:

max=10
for i in $(bash -c "echo {2..${max}}"); do echo $i; done

উপরের বাশ উপায়টি কাজ করবে kshএবং zshখুব বেশি, কখন বা এর bash -cসাথে প্রতিস্থাপিত হবেksh -czsh -c যথাক্রমে।

দ্রষ্টব্য: for i in {2..${max}}; do echo $i; doneকাজ করে zshএবং ksh


4

আমরা সি প্রোগ্রামিংয়ের মতো লুপটি পুনরাবৃত্তি করতে পারি।

#!/bin/bash
for ((i=1; i<=20; i=i+1))
do 
      echo $i
done

2

এখানে এটি ম্যাক ওএস এক্সে কাজ করেছে

এটিতে BSD তারিখের উদাহরণ অন্তর্ভুক্ত রয়েছে, কীভাবে বৃদ্ধি এবং তারিখটি কীভাবে হ্রাস করা যায়:

for ((i=28; i>=6 ; i--));
do
    dat=`date -v-${i}d -j "+%Y%m%d"` 
    echo $dat
done

2

ঠিক আছে, যেহেতু seqআমার সিস্টেমে কমান্ডটি ইনস্টল করা হয়নি (ম্যাক ওএস এক্স ভি 10.6.1 (স্নো চিতা)), whileতার পরিবর্তে আমি একটি লুপ ব্যবহার করে শেষ করেছি :

max=5
i=1

while [ $max -gt $i ]
do
    (stuff)
done

* শ্রাগস * যাই কাজ করে।


2
seq তুলনামূলকভাবে নতুন। আমি এটি সম্পর্কে কয়েক মাস আগে জানতে পেরেছি। তবে আপনি একটি 'ফর' লুপ ব্যবহার করতে পারেন !! একটি 'সময়' এর অসুবিধা হ'ল আপনাকে লুপের ভিতরে কোথাও কাউন্টারটি বাড়িয়ে দিতে হবে, অন্যথায় লুপটি নীচের দিকে রাখতে হবে।
সিস্টেম PAUSE

1

এগুলি সবই হয় {1..8}এবং সবগুলিই পসিক্স হওয়া উচিত আপনি continueলুপে শর্তযুক্ত রাখলে সেগুলিও ভাঙবে না । ক্যানোনিকাল উপায়:

f=
while [ $((f+=1)) -le 8 ]
do
  echo $f
done

অন্য উপায়:

g=
while
  g=${g}1
  [ ${#g} -le 8 ]
do
  echo ${#g}
done

এবং অন্য:

set --
while
  set $* .
  [ ${#} -le 8 ]
do
  echo ${#}
done

1

ব্যবহার করুন:

max=10
for i in `eval echo {2..$max}`
do
    echo $i
done

পরিবর্তনশীল প্রতিস্থাপনের পরে {re পুনর্মূল্যায়নের জন্য আপনার সুস্পষ্ট 'ইওল' কলটি দরকার।

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