কেন আমাকে "কর" একই লাইনে "কর" রাখার দরকার আছে?


28

1. সংক্ষিপ্তসার

আমি বুঝতে পারছি না, কেন আমার E010 বাশাতে নিয়ম দরকার ।


2. বিশদ

আমি ফাইলটিংয়ের জন্য বাশাতে ব্যবহার করি .sh। E010 বিধি:

কি হিসাবে একই লাইনে না জন্য

for bashate:

  • সঠিক:

    #!/bin/bash
    for f in bash/*.sh; do
        sashacommand "$f"
    done
    
  • ত্রুটি:

    #!/bin/bash
    for f in bash/*.sh
        do sashacommand "$f"
    done
    

কোন বৈধ তর্ক আছে, কেন আমার প্রয়োজন forএবং doএকই লাইনে?


3. দরকারী নয়

আমি আমার প্রশ্নের উত্তর এখানে খুঁজে পাচ্ছি না:

  1. গুগল
  2. সেরা কোডিং অনুশীলন সম্পর্কে নিবন্ধগুলি ( উদাহরণস্বরূপ )
  3. bashate ডকুমেন্টেশন । আমি কেবল পাই:

    নিয়মের একটি সেট যা নিয়ন্ত্রণ ব্লকে জিনিসগুলিকে সামঞ্জস্য রাখতে সহায়তা করে। এগুলিকে লম্বা লাইনে অগ্রাহ্য করা হয় যা একটি ধারাবাহিকতা রয়েছে, কারণ তালিকাভুক্তিটি এক ধরণের "আকর্ষণীয়"


3
অভিযুক্তটি doঅবশ্যই কিছুটা অস্বাভাবিক, তবে for ... \ndo\n<indent>body...এটি অত্যন্ত সাধারণ এবং আমি এর চেয়ে আরও বেশি অনুমান করতে পারি for ... ; do। এটি সম্পর্কে কি অভিযোগ আছে?
মাইকেল হোমার

20
bashateএকটি শৈলী পরীক্ষক। শৈলীগুলি সহজাতভাবে বিষয়গত হয়। আপনি যদি চাপানো শৈলীটি পছন্দ করেন না তবে এটি ব্যবহার করবেন না। পরিবর্তে আপনাকে শেলচেকের মতো একটি সিনট্যাক্স / বাগ চেকার বিবেচনা করা উচিত ।
meuh

@ মিউহ, ধন্যবাদ, আমি ইতিমধ্যে শেলচেক ব্যবহার করেছি। আমার প্রশ্ন: E010- শুধুমাত্র শৈলী নিয়ম বা কিছু ক্ষেত্রে আমি প্রয়োজন জন্য এবং কি না শুধুমাত্র শৈলী কারণে একই লাইনে।
Черн хых

10
সেখানে কখনো করার জন্য একটি অন্বিত বাধ্যবাধকতা জন্য এবং কি শেল মধ্যে একই লাইনে।
meuh

1
@ Саша Черных এটি নিজেই ইন্ডেন্টেশনটি অস্বাভাবিক নয়, এটি ইনডেন্টিং do। এটি সিটির মতো একটি ভাষায় একটি খোলার ব্রেস ইনডেন্ট করা ifএবং একই লাইনে কোড যুক্ত করার মতো অন্য একটি উদাহরণ, পাইথন যদি এটির অনুমতি দেয় তবে পরবর্তী লাইনে :একটি ifইন্টেন্ট করা এবং সেই একই লাইনে কোড যুক্ত করা হবে। এটি এটিকে শরীরে অতিরিক্ত রেখার সাথে পৃথক করতে চলেছে।
জোল

উত্তর:


60

কৃত্রিমভাবে, নিম্নলিখিত দুটি কোড স্নিপেটগুলি সঠিক এবং সমতুল্য:

for f in bash/*.sh; do
    sashacommand "$f"
done
for f in bash/*.sh
    do sashacommand "$f"
done

দ্বিতীয়টি সম্ভবতdo লুপের শরীরে কমান্ডটি অল্পবিস্তৃত করার কারণে এটি পড়া শক্ত হতে পারে বলে মনে করা যেতে পারে । যদি লুপটিতে একাধিক কমান্ড থাকে এবং পরবর্তী কমান্ডটি একটি নতুন লাইনে থাকে তবে অবচলনটি আরও হাইলাইট করা হবে:

for f in *
    do cmd1
    cmd2
done

... তবে এটিকে "ত্রুটি" হিসাবে চিহ্নিত করা হ'ল আইএমএইচও হ'ল উদ্দেশ্যমূলক সত্যের চেয়ে কারও ব্যক্তিগত মতামত।

সাধারণভাবে, প্রায় যে কোনও ;একটি নতুন লাইন দ্বারা প্রতিস্থাপিত হতে পারে। ;এবং নিউলাইন উভয়ই কমান্ড টার্মিনেটর। doএকটি কীওয়ার্ড যার অর্থ "এখানে যা করা দরকার তা এখানে অনুসরণ করে (এই forলুপটিতে)"।

for f in *; do ...; done

এটার মতই

for f in *
do
   ...
done

এবং হিসাবে

for f in *; do
   ...
done

একে অপরকে ব্যবহার করার কারণ হ'ল পাঠযোগ্যতা এবং স্থানীয় / ব্যক্তিগত স্টাইলের সম্মেলন।


ব্যক্তিগত মতামত:

খুব লম্বা লুপ শিরোনামগুলিতে , আমি মনে করি যে এটি doনতুন লাইনে লাগানো বুদ্ধিমান হতে পারে in

for i in animals people houses thoughts basketballs bees
do
    ...
done

অথবা

for i in        \
    animals     \
    people      \
    houses      \
    thoughts    \
    basketballs \
    bees
do
    ...
done

একই জন্য যায় thenএকটি ইন ifবিবৃতি।

তবে আবার এটি কারও ব্যক্তিগত শৈলীর পছন্দগুলিতে নেমে আসে, বা যে কোনও কোড / স্টাইল যার দল / প্রকল্প ব্যবহার করছে তাতেই আসে।


আপনি বলছেন যে "লুপ শিরোনামগুলিতে যেগুলি খুব দীর্ঘ, এটি একটি নতুন লাইনে রেখে দেওয়া বুদ্ধিমান হতে পারে"। আপনি কি এর জন্য কোনও কারণ সরবরাহ করতে পারেন? শিরোনামটি অবশ্যই অনুসরণ করা উচিতdo , এটি পরের লাইনে রেখে দেওয়ার কারণে পাঠ্যতা সহজ হয় a
কনরাড রুডল্ফ

3
@ কনরাডরুডলফ আমার টার্মিনালটি 80 টি অক্ষর প্রস্থ। যদি তালিকাটি মোড়ানো হয়, তবে আমি এটির ধারাবাহিক রেখার একটি সেট তৈরি করব (আমার শেষ উদাহরণ হিসাবে) এটি প্রায় আবৃত হলে, আমি do(বা then) একটি নিজস্ব লাইনে (দ্বিতীয় থেকে শেষ উদাহরণ হিসাবে) রেখে দেব । এই সমস্ত ব্যক্তিগত পছন্দসই সঙ্গে ডি করতে হবে। আমি অত্যধিক দীর্ঘ রেখাগুলি পছন্দ করি না, আংশিক কারণ আমার টার্মিনালটি "কেবল" 80 টি অক্ষর প্রশস্ত এবং আংশিক কারণ আমার মনে হয় এটি অস্বচ্ছ দেখাচ্ছে। ত্রুটিগুলির জন্য খুব দীর্ঘ লাইনগুলি পার্স করাও আমার কাছে কঠিন মনে হয়।
কুসালানন্দ

1
এটি মতামতটি উল্লেখ করা অযৌক্তিক বলে মনে হচ্ছে। বাশাতে একটি শৈলী নির্দেশিকা, সুতরাং এটি সহজাতভাবে মতামতের উপর ভিত্তি করে।
বর্মার

4
বার্মার, এখানে লক্ষ্য রাখবেন যে এখানে প্রশ্নটি "প্রয়োজন" এবং "নিয়ম" এর মতো বাক্য ব্যবহার করে এবং বাশাতে রিডমে কলগুলি doএকটি পৃথক লাইনে একটি "ত্রুটি" রয়েছে calls সেই বরং কঠোর বাক্যাংশ হয়, তাই এটি নেই এটা যে বাতলান, বেশ বিপরীত, তথাকথিত "শাসন" আসলে শুধু একটি ইতিবাচক মতামত মূল্য বলে মনে হচ্ছে।
ইল্কাচ্চু

2
@ মিটারেসর ঠিক আছে, আমি ব্যক্তিগত পছন্দগুলি নিয়ে প্রশ্ন করছি না। তবে সচেতন থাকুন যে পাঠ্যযোগ্যতার কলাম সীমা আপনার উদ্ধৃতি কোডের ক্ষেত্রে প্রযোজ্য নয়। এটি কেবল গদ্যের ক্ষেত্রে প্রযোজ্য। কোড রিডিংয়ের জন্য চোখের চলাচল মৌলিকভাবে পৃথক, সুতরাং সেই অধ্যয়নগুলির প্রমাণগুলি এখানে প্রযোজ্য নয়। এবং historicalতিহাসিক কারণে যে যুক্তি হিসাবে আর প্রয়োগ করা হয় তা ব্যবহার করার জন্য, আমরা গত 8.3 ফাইলের নামও ব্যবহার করেছি used
কনরাড রুডলফ

28

পৃষ্ঠার শীর্ষে এটি কী বলেছে তা নোট করুন:

বাশাতে: ব্যাশ স্ক্রিপ্টগুলির জন্য একটি সমান পেপ 8

পিইপি 8 পাইথন কোডের স্টাইল গাইড। পাইথন লোকেরা প্রায়শই তাদের শৈলীর বিষয়গুলি অত্যন্ত গুরুত্ব সহকারে নেয় বলে মনে হয় [উদ্ধৃতি প্রয়োজন] , ঠিক এটিই, গাইড। আমরা উভয়ই doএকই লাইনে forলাগানোর জন্য এবং এটির নিজস্ব লাইনে রেখে উভয়ই আপসাইড নিয়ে আসতে পারি ।

যেখানে লাগাতে হিসাবে একই আলোচনা করেন {সি কোডে একটি শুরু ifবা whileব্লক (বা)।


ডকুমেন্টেশনের নীচে কয়েকটি লাইন, এখানে আরও একটি আকর্ষণীয় নিয়ম রয়েছে:

E020: ফাংশন ঘোষণা ফর্ম্যাটে নয় ^function name {$

আমি এখানে মূল বিষয়টি ধরে নিয়েছি যে style স্টাইল গাইডটির লেখক মনে করেন যে functionপাঠকের কোনও ক্রিয়াকলাপের স্বীকৃতি স্বীকার করার জন্য মূল শব্দটি ব্যবহার করা প্রয়োজনীয়। যাইহোক, function fooএকটি হল অ-মানক একটি ফাংশন সংজ্ঞায়িত প্রণালী: আদর্শ উপায় হয় foo()। দু'জনের মধ্যে (বাশের মধ্যে) কেবলমাত্র পার্থক্যটি হ'ল অন্যটি স্ট্যান্ডার্ড শেলটি পোর্ট করা শক্ত, যেমন /bin/shডেবিয়ান বা উবুন্টুর মতো।

সুতরাং, আমি পরামর্শ দিচ্ছি যে কোনও এবং এই জাতীয় সমস্ত স্টাইলের গাইডের সাথে নুন বা তিনটির দানা নেওয়া উচিত এবং নিজের জন্য সিদ্ধান্ত নিন যে সেরা স্টাইলটি কী। একটি ভাল স্টাইল-চেকার কিছু চেক নিষ্ক্রিয় করার অনুমতি দেয় (বাশাতে bashate -i E010,E011এই দুটি চেক উপেক্ষা করতে হবে)) একটি দুর্দান্ত স্টাইল-পরীক্ষক আপনাকে পরীক্ষাগুলি সংশোধন করার অনুমতি দেবে, যেমন E020 এর বিপরীতে এখানে পরীক্ষা করতে for


12

টিএল; ডিআর: আপনার দরকার নেই। এটা ঠিক কিছু ছেলের মতামত।

অন্যান্য অনেকের মতো আমি forকয়েক দশক ধরে এ জাতীয় লুপ লিখছি :

for F in arg1 arg2 arg*
do
    somecommand "$F"
done

এই লেআউটটি do ... doneসি-জাতীয় ভাষায় কোঁকড়ানো ধনুর্বন্ধনীগুলির মতো লুপের দেহকে ঘিরে এই সত্যটি তুলে ধরে এবং নিউলাইনগুলিকে লুপ কনস্ট্রাক্টের উপাদানগুলিকে পৃথক করার অনুমতি দেয়।

অবশ্যই কোঁকড়া ধনুর্বন্ধনীগুলি কোথায় রাখবেন সে সম্পর্কে ধর্মীয় যুদ্ধ রয়েছে, সুতরাং আপনি বলতে পারেন যে জুরি এখনও এইটির বাইরে রয়েছে। আইএমএইচও, এটি স্পষ্টভাবে কীভাবে এটি কাজ করার জন্য ডিজাইন করা হয়েছিল; বর্ন মিলে ডিলিমিটারদের পছন্দ করতেন, সিএফ। if ... fi, case ... esacএবং সংক্ষিপ্ত সংস্করণে একটি সেমিকোলনের প্রয়োজনীয়তা প্রকাশ করে যে আপনি এটিকে মূল নকশার চেয়ে কম তৈরি করছেন। এতে কোনও ভুল নেই; প্রযুক্তির অগ্রগতি এবং অনেকগুলি জিনিস যা একবারে একটি ভাল ধারণা বলে মনে হয়েছিল এখন যেমন, তেমন ভ্রান্ত goto। তবে যতক্ষণ না পুরো শেল-স্ক্রিপ্টিং সম্প্রদায়টি bashateলেখক (গুলি) এর পছন্দগুলি গ্রহণ করে , আপনাকে কিছু করতে হবে না।


3
fiযে অনুরূপ if, এবং esacইত্যাদি কম্পিউটারে কাজ করার একটি ভাষা 68. একমাত্র কারণ একটি থেকে আসে forলুপ 's doশেষ হয়েছে না হয় দ্বারা odযে odকোনো বিদ্যমান প্রমিত উপযোগ নাম। দেখুন en.wikipedia.org/wiki/ALGOL_68C#Algol_68C_and_Unix
Kusalananda

1
ডান, এবং কীওয়ার্ড-বিস্মৃত ব্লকগুলি পাস্কাল (যা ব্যবহার begin ... endইত্যাদি) সহ আলগোল পরিবারের অন্যান্য ভাষায়ও ব্যবহৃত হয়েছিল ।
অ্যালেক্সিস

2
গল্পটি শুনিনি od, এটি মজাদার ... (যদিও, তবে কেন কেবল লুপগুলি দিয়ে শেষ করা যায় না rof, তবে?)
অ্যালেক্সিস

2
@ আলেক্সিস ওয়েল, যেমন কুসালানন্দ বলেছিলেন, এটি আলগোল 68৮ থেকে এসেছে, এটিই মূল বিষয়। আসল বোর্ন শেলটির স্রষ্টা স্টিফেন বোর্ন সেই ভাষা দ্বারা প্রচণ্ডভাবে প্রভাবিত হয়েছিলেন এবং সে কারণেই তিনি সেই বাক্য গঠনে আটকে ছিলেন। এমনকি যখন তিনি সি লিখছিলেন তখনও বোর্ন শেলটির উত্স কোড দেখুন: minnie.tuhs.org//cgi-bin/utree.pl?file=V7/usr/src/cmd/sh/mac.h ওহ, এবং উপায়, BEGINএবং ENDপাশাপাশি সংজ্ঞায়িত করা হয়।
সের্গেই কোলোডিয়াজনি

1
এই সম্পূর্ণ ফর্ম্যাটিং শৈলীটিও আলগোল থেকে। 68 টি পথে। এটি FORএবং DOপৃথক লাইনে থাকবে কনভেনশন অনুসারে, যখন পুরো লুপটি কোনও এক লাইনে সহজেই ফিট হয়ে যায় except
পুনরায় পোস্টার

3

আমি অবাক হয়েছি এখনও কেউ এই বৈধ এবং পোর্টেবল সিনট্যাক্সের উল্লেখ করেনি:

set alfa bravo charlie
for q do
  echo "$q"
done

সাবধানে লক্ষ্য করুন forএবং doসেমিকোলন ছাড়াই একই লাইনে রয়েছে। ফলাফল:

alfa
bravo
charlie

আমি এই অস্পষ্টতার একটি উল্লেখ (তবে কিছু ক্ষেত্রে ক্লিন এবং পোর্টেবল শেল কোডের জন্য সমালোচনা) সিনট্যাক্সের উল্লেখের জন্য প্লাগিনের জন্য এই উত্তরটির অনুমোদন দিই, তবে এটি স্পষ্টভাবে লোকদের কাছে ব্যাখ্যা করার উপযুক্ত যে এই ক্লোবারগুলি অবস্থানগত পরামিতিগুলি, এবং আমিও উল্লেখ করতে বাধ্য হচ্ছি শুধুমাত্র "সত্যিই পোর্টেবল (TM)" ফর্ম অন্যতম যেখানে for qএবং doপৃথক লাইন আছে (এই উদাহরণে ফর্ম মূল Almquish শেল (চালু অসমর্থিত একটি দম্পতি দশক আগে ছিল ash): in-ulm.de/~mascheck/various/ বোর্ন_আরগস / # এন্ডোট )
এমট্রেসিয়র

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

3

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

আমি যখন শেল শিখতে শুরু করি তখন বেশিরভাগ স্ক্রিপ্ট এবং টিউটস আউট-লাইন সেমিকোলন ফর্ম্যাটটি ব্যবহার করে

for i in "$@"; do
    stuff
done

তবে আমি অনভিজ্ঞ ছিলাম বলে আমি কিছুটা কঠিন সময় কাটিয়েছি; এবং করবেন - উভয়ই সিন্টেক্সটিকাল নির্ভুলতা নিশ্চিত করার জন্য প্রয়োজনীয়। সুতরাং আমি নিজেই পরবর্তী লাইনে করণটিকে পছন্দ করেছি। আমি আর এটি করি না (পাং উদ্দেশ্যে)

আরও, 'যখন' কমান্ডটি একটি দুর্দান্ত সামান্য কৌশলটির জন্য দুর্দান্ত প্রার্থী:

while prep1; prep2; condition; do
    stuff
done

তবে যখন প্রিপ কম্যান্ডগুলি কিছুটা ভারী হয় এবং এবং / বা শর্তটি জটিল হয় তখন এটি আরও ভাল হিসাবে ফর্ম্যাট হয়

while
    prep1
    prep2
    condition
do
    stuff
done

এবং তারপরে "; কর" হিসাবে করাকে যুক্ত করা ইতিবাচকভাবে পলকযুক্ত।

আপনি তার থেকে আরও তীব্র পেতে পারেন:

while
    if con1; then
      cond2
    elif cond3; then
      cond4
    elif cond5; then
      cond6
    else
      cond7
    fi
do
    stuff
done

কারণ প্রতিটি বক্তব্যই একটি অভিব্যক্তি। উভয় শৈলী কীভাবে সুবিধাবাদীভাবে ব্যবহৃত হয় তা লক্ষ্য করুন। এটি পরিষ্কার রাখুন এবং এটি বেশ পঠনযোগ্য। স্টাইল বা "স্পেস সেভিং" এর নামে কমপ্যাক্ট করুন বা কনটোর্ট করুন এবং এটি একটি ভয়াবহ জগাখিচুড়ি হয়ে যায়।

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

কমান্ডের সাথে 'ফর্ম' যেখানে ইনলাইন লিখিত আছে তা মিষ্টি হয় যখন আপনার একটি সামান্য আদেশ থাকে - আমি 'কর' দৃশ্যত লুকিয়ে দেখতে পাই না বা অভ্যন্তরীণ কমান্ডটি সত্যই অস্পষ্ট হয় না:

for i in whatever
  do stuff
done

আমি এটি দেখতে বেশ আনন্দদায়ক বলে মনে করি এবং এর সাথে কিছুক্ষণ, যদি এবং কেসের সাথে এনালগ থাকে:

while condition
  do stuff
end

if condition
  then stuff1
  else stuff2
fi

case $blah in
  a) stuff1;;
  b) stuff2;;
  c) stuff3;;
  *) stuffInfinity;;
esac

স্পষ্টতা এবং সাধারণ পরিচ্ছন্নতা কোডড * আপনাকে যা জিজ্ঞাসা করে তা।

* অ্যাডগার এফ। কোডড, রিলেশনাল ডাটাবেস তত্ত্বের জনক।


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