লুপের জন্য বাশ-এ "কর" কীওয়ার্ডটির উদ্দেশ্য কী?


76

doবাশ forলুপ সিনট্যাক্সে কীওয়ার্ডটির উদ্দেশ্য কী ? আমার কাছে এটি বেআইনী মনে হয়।

for i in `seq 1 2`; do echo "hi"; done

সিনট্যাক্সটি কেন এমন নয়?

for i in `seq 1 2`; echo "hi"; done

আমি নিশ্চিত যে এটি একটি উদ্দেশ্য পূরণ করে । আমি শুধু শিখতে চাই

উত্তর:


118

নোট করুন যে সিনট্যাক্সটি বর্ন শেল থেকে উত্তরাধিকার সূত্রে প্রাপ্ত।

ভেরিয়েবল নামের পরে, আপনার কাছে হয় inউপাদানগুলির স্পষ্টভাবে দেওয়া তালিকা থাকতে পারে , বা doঅবস্থানগত পরামিতিগুলি লুপ করতে।

for i in 1 2 3
do
  echo "$i"
done

অথবা

set 1 2 3
for i do
  echo "$i"
done

রয়ে doউভয় ক্ষেত্রেই (এমনকি যদি এটা কঠোরভাবে প্রথম এক প্রয়োজনীয় নয়) আরো একটি সামঞ্জস্যপূর্ণ সিনট্যাক্স করে তোলে। এটি প্রয়োজনীয় while/ untilলুপগুলির সাথে সামঞ্জস্যপূর্ণ do

while
  cmd1
  cmd2
do
  cmd3
  cmd4
done

শর্ত কমান্ডের doতালিকাটি কোথায় শেষ হবে তা আপনাকে জানাতে হবে ।

নোট করুন যে বোর্ন শেল সমর্থন করে নি for i; do। সেই বাক্য গঠনটিও ২০১ 2016 সালের স্ট্যান্ডার্ডের সংস্করণ অবধি পসিক্স ছিল না ( for i doসর্বদা পসিক্স হয়েছে; সম্পর্কিত অস্টিন গ্রুপ বাগটি দেখুন )।

zsh কয়েকটি শর্টহ্যান্ড ফর্ম রয়েছে যেমন:

for i in 1 2 3; echo $i
for i (1 2 3) echo $i
for ((i=1;i<=3;i++)) echo $i

বা একাধিক ভেরিয়েবলের জন্য সমর্থন:

for i j (1 a 2 b) echo $i $j

(যদিও আপনি ব্যবহার করতে পারবেন না inবা doস্থানে পরিবর্তনশীল নামের jউপরে)।

এমনকি যদি খুব কমই নথিভুক্ত করা হয় তবে বেশিরভাগ বোর্নের মতো শেল (বোর্ন, কেশ, বাশ, জ্যাশ, না ashনয় yash)ও সমর্থন করে:

for i in 1 2 3; { echo "$i";}

বোর্ন শেল, kshএবং zsh(তবে নয় bash) এছাড়াও সমর্থন করে:

for i { echo "$i"; }

যখন bash, kshএবং zsh(তবে বোর্ন শেল নয়) সমর্থন করে:

for i; { echo "$i"; }

সমস্ত (বোর্ন, bash, ksh, zsh) সহায়তা:

for i
{ echo "$i";}

ksh93, bash, zshসহায়তা:

for ((i=1;i<=3;i++)) { echo "$i"; }

2
সর্বদা হিসাবে, সম্পূর্ণ এবং নিখুঁত উত্তর (zsh একটি রেফারেন্স সহ) ...
কিউই

2
এটি উভয় ক্ষেত্রেই "কঠোরভাবে প্রয়োজনীয়" নয় for; কমান্ডটি একটি নতুন লাইন বা সেমিকোলন দ্বারা শেষ হতে পারে। এটি if/ while(পূর্বের thenপরিবর্তে প্রাক্তনটির do) জন্য কিছুটা আরও অর্থবোধ করে , তবে নীতিগতভাবে তারা এটিকে বাদ দিতে পারত এবং একাধিক কমান্ডের (বিরল) ব্যবহারের জন্য সাবসেল বা ধনুর্বন্ধনী প্রয়োজন হত। আমি বোর্ন শেলটি করার আসল কারণটি সন্দেহ করি কারণ ALGOL এটি করে এবং আমাদের খুশি হওয়া উচিত যা doneবানান নয় od
র্যান্ডম 832

4
@ র্যান্ডম 832: কারণ odএটি ইতিমধ্যে অক্টাল ডাম্প প্রোগ্রামের নাম হিসাবে ব্যবহৃত হয়েছিল।
ব্যবহারকারী 1024

8
এখানে অনেক কিছুই আমি জানতাম না। ধন্যবাদ!
হালকা ঘোড়দৌড়

1
@ এমিরাবিলোস, for i doবোর্ন এবং পসিক্স, তবে অ্যাশ-ভিত্তিক শেলগুলি আইআইআরসি-র কয়েকটি পুরানো সংস্করণে কাজ করবে না। স্থান অক্ষর না for i in "$@"থাকলে বোর্ন শেলটিতে কাজ করবে না $IFSfor i<newline>doআপনার খুব পুরানো বিএসডি সিস্টেমগুলি বিবেচনার প্রয়োজন হলে প্রকৃতপক্ষে সবচেয়ে বহনযোগ্য। দেখুন in-ulm.de/~mascheck/various/bourne_args বিস্তারিত জানার জন্য
Stéphane Chazelas
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.