Zsh এবং ব্যাশে লুপগুলির জন্য


57

আমি লক্ষ করেছি যে zsh এ দুটি লুপ তৈরির বিকল্প উপায় রয়েছে :

  1. for x (1 2 3); do echo $x; done
  2. for x in 1 2 3; do echo $x; done

তারা উভয় মুদ্রণ:

1
2
3

আমার প্রশ্ন, দুটি বাক্য গঠন কেন? তাদের প্রত্যেকের মধ্যে কি $xবিভিন্ন ধরণের অবজেক্টের মাধ্যমে পুনরাবৃত্তি হচ্ছে ?

বাশ কি একইরকম পার্থক্য করে?

সংযোজন:

নিম্নলিখিতগুলি কেন কাজ করে ?:

#!/bin/zsh
a=1
b=2
c=5    

d=(a b c)    
for x in $d; do print $x;done

কিন্তু এই না ?:

#!/bin/zsh
a=1
b=2
c=5

d=(a b c)    
# It complains with "parse error near `$d'"
for x $d; do print $x;done 

5
উদাহরণস্বরূপ যে "কাজ করে না", এটি লুপের জন্য csh শৈলী, আপনি বন্ধনী অনুপস্থিত। for x ($d); do print $x; doneকাজ করবে এবং এটি আপনার প্রশ্নের শুরুতে গণনা করা প্রথম সিনট্যাক্সের সাথে মিলবে।
টিম কেনেডি

1
এটি অত্যন্ত পাগল - যে এই দুটি বিবৃতি - সত্যই উভয় "একই কাজ করে না"। আমি আক্ষরিক অর্থে এটি পেতে পারি না! আমি যারা শেল ডিজাইনাররা ধূমপান করছিলেন সেগুলির মধ্যে কিছুটা ধূমপান করা দরকার ol
অ্যালেক্স ধূসর

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

আমি অন্য কাউকে এটি উল্লেখ করতে দেখিনি, তবে উভয় রূপই কর / সম্পন্ন: for i ({0..4..2}) for j ({a..c}) echo "($i,$j)"= বাদ দিতে দেয় {0,2,4}x{a,b,c}। সেমিকোলনগুলি বাইরেরতম লুপে প্রয়োগ হয় এবং পুনঃনির্দেশগুলি অন্তঃস্থরের ক্ষেত্রে প্রযোজ্য এবং আপনার যদি এটি পরিবর্তন করতে হয় তবে আপনার কেবল ধনুর্বন্ধনী প্রয়োজন: for i ({0..4..2}) { for j ({a..c}) echo "($i,$j)" } | cat -n= {1,...,9}*({0,2,4}x{a,b,c})। অবশ্যই আপনি zsh বিস্তারের সাথে লুপগুলি একত্রিত করতে পারেন:for i ("("{0..4..2}","{a..c}")") echo $i
জন পি

উত্তর:


58

জটিল কমান্ডগুলির বেশ কয়েকটি ফর্ম যেমন লুপগুলির zsh এ বিকল্প ফর্ম রয়েছে। এই ফর্মগুলি বেশিরভাগ সি শেল দ্বারা অনুপ্রাণিত হয় , যা জেডএস অল্প বয়সে মোটামুটি সাধারণ ছিল তবে এখন অদৃশ্য হয়ে গেছে। এই বিকল্প ফর্মগুলি সাধারণ ফর্মগুলির মতো হুবহু কাজ করে, এগুলি কেবল একটি আলাদা বাক্য গঠন। এগুলি কিছুটা খাটো, তবে কম পরিষ্কার।

forকমান্ডের জন্য স্ট্যান্ডার্ড ফর্ম for x in 1 2 3; do echo $x; done, এবং whileকমান্ডের জন্য আদর্শ ফর্মটি while test …; do somecommand; done। Ksh, বাশ এবং zsh এর বিকল্প রূপ রয়েছে for: for ((i = 0; i < 42; i++)); do somecommand; doneযা forপাসকাল বা সি এর মতো ভাষার লুপগুলি অনুকরণ করে , পূর্ণসংখ্যা গণনা করে। অন্যান্য বিদেশী রূপগুলি যা zsh এ বিদ্যমান তা zsh এর জন্য নির্দিষ্ট (তবে প্রায়শই csh দ্বারা অনুপ্রাণিত হয়)।


অসংখ্য ধন্যবাদ গুইলস। যদিও আমি এখনও কিছুটা বিভ্রান্ত। নির্দিষ্ট কোনটি zsh? এছাড়াও, আমি আমার ওপি এর শেষে একটি উদাহরণ যুক্ত করেছি যেখানে আমি সিনট্যাক্সগুলির মধ্যে কীভাবে অনুবাদ করব তা অনুমান করতে পারি না। পার্থক্যটি যদি কেবল সিনট্যাক্স হয়, তবে এটির কাজ করার জন্য আমি কীভাবে সংযুক্তিতে দ্বিতীয় স্ক্রিপ্ট ঠিক করব?
আমেলিও ওয়াজকেজ-রেইনা

3
@intrpc আমার আপডেট হওয়া উত্তর দেখুন। আপনার শেষ উদাহরণ হিসাবে, এটি কাজ করে না কারণ আপনি লিখেছিলেন for x $dএবং zsh আশা করেন inবা (আপনি যেখানে লিখেছিলেন $d। বিরামচিহ্ন চিহ্ন এবং সংরক্ষিত শব্দগুলি একটি পরিবর্তনশীল প্রসার থেকে আসতে পারে না, ভেরিয়েবল বিস্তৃতিতে শেল শুরুর আগে তাদের পার্স করতে হবে।
গিলস 'অশুভ হওয়া বন্ধ করুন'

@intrpc উভয়ই zsh নির্দিষ্ট। zsh বিশেষভাবে বোর্ন, কর্ন এবং সি-শেল সিনট্যাক্স উভয়কেই সমর্থন করার জন্য ডিজাইন করা হয়েছিল, কারণ এটি তিনটিরই হাইব্রিড।
টিম কেনেডি

1
@ স্পিফার্ট এটি কাজ করে তবে আমি যে ফর্মগুলি দেখি তাতে তার কোনও লাভ নেই: এটি for (( … ))ফর্মের চেয়ে কম পোর্টেবল এবং 3 টি বড় হলে প্রচুর স্মৃতি ব্যবহার করে।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

1
@ alpha_989 sh-like সিনট্যাক্সে আপনার doপরে দরকার ));। Zsh আরও একটি বাক্য গঠন গ্রহণ করে for ((…)); COMMANDযেখানে COMMANDএকক কমান্ড রয়েছে। এজন্যই এটি গ্রহণ করে for ((i = 1; i<100; i++)); ghi show $i | grep "log"। এটি এর doneপরে দেখলে এটি অভিযোগ করে কারণ doশেষ করার মতো কিছুই ছিল না । ম্যানুয়ালটিতে "কমপ্লেক্স কমান্ডগুলির বিকল্প ফর্মগুলি" দেখুন ।
গিলস 'অশুভ হওয়া বন্ধ করুন'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.