`If` এবং` then` আসলে প্রোগ্রাম


15

আমি পড়েছি যে সেমিকোলনটি পৃথক প্রোগ্রামগুলির জন্য ব্যবহৃত হয়:

$ echo 3; ls -la

এটা যে এর অর্থ কি if, thenএবং elseপৃথক প্রোগ্রাম এখানে?

$ if [ $VARIABLE == abcdef ] ; then echo yes ; else echo no ; fi

এই প্রশ্নটি সেমিকোলন সম্পর্কে নয়।



1
@ স্টেফেনআরচ সত্যিই একটি সদৃশ নয়। আরও এটি বোঝার চেষ্টা হিসাবে এই কিউ থেকে একটি যুক্তিসঙ্গত আউটগ্রোথ।
ব্যবহারকারী 207673

আরও প্রোগ্রামেম-ওয়াই সূত্র:[ $variable == abcdef ] && echo yes || echo no
হ্যাগেন ভন ইটজেন

2
@ হ্যাগেনভোন এটজেন এটি কঠোর সমতুল্য নয়, যদি প্রথম শাখার মধ্যে বিবৃতি ব্যর্থ হয় তবে দ্বিতীয়টিও কার্যকর হবে।
মরগেন

উত্তর:


26

;আলাদা বিবৃতি (ঢিলেঢালাভাবে ভাষী)। ;একটি নতুন লাইন দ্বারা একটি প্রতিস্থাপন (প্রায়) সর্বদা সম্ভব ।

অর্থাৎ ;আলাদা দুটি প্রোগ্রাম তাই ifএবং then"প্রোগ্রাম" একটি বিট খুব সরল যেমন একটি বিবৃতি সংরক্ষিত শব্দ, শেল ফাংশন দিয়ে তৈরি করা যেতে পারে, হতে হবে বিল্ট-ইন ইউটিলিটি ও বহিস্থিত ইউটিলিটি, এবং এই পাইপ ব্যবহারের সমন্বয় এবং বুলিয়ান অপারেটরদের ইত্যাদি ইত্যাদি

উভয় ifএবং শেল ব্যাকরণেthen সংরক্ষিত শব্দ , "প্রোগ্রাম" নয়। এখানে তারা প্রযুক্তিগতভাবে একটি যৌগিক কমান্ড যাকে বলে তা তৈরি করতে ব্যবহৃত হয় ।

echoসম্ভবত শেলের একটি অন্তর্নির্মিত ইউটিলিটি (তবে এটি হওয়ার দরকার নেই), এবং lsসম্ভবত একটি বাহ্যিক ইউটিলিটি (বা "প্রোগ্রাম" যেমন আপনি বলেছেন)।


7

যদিও এটি প্রথমে ন্যায্য প্রথম অনুমান হিসাবে যখন কেউ শাঁস ব্যবহারের প্রাথমিক বিষয়গুলি শিখতে শুরু করে, "এখানে কীভাবে একটি প্রোগ্রাম চালানো হয়" এবং "এখানে কীভাবে একের পর এক একের পর এক একাধিক প্রোগ্রাম পরিচালিত হয়" এর স্তরে , এটা আসলে সত্য নয়।

কোনও শিক্ষানবিশকে উপলব্ধি করা আরও শক্ত কিন্তু আরও সঠিক ব্যাখ্যাটি হ'ল শেল ভাষা একটি কম্পিউটার ভাষা । এটি একটি বাক্য গঠন আছে । এই বাক্য গঠনটিতে (অন্যান্য জিনিসের মধ্যে) নিউলাইনস, অপারেটর, শব্দ এবং সংরক্ষিত শব্দগুলি সহ বিভিন্ন লিক্সিক উপাদান রয়েছে।

if, then, else, এবং fiসব সংরক্ষিত শব্দব্যাকরণ অনুযায়ী, কোনও শেলকে যে ইনপুট দেয় তা পার্স করার সময় তাদের বিশেষ অর্থ থাকে । একইভাবে, একটি বিভাজক অপারেটর;

শেল ভাষার ইনপুটটিকে সামগ্রিকভাবে নেওয়া হয়, এমন একটি কম্পিউটার প্রোগ্রাম যা অন্য প্রোগ্রাম দ্বারা ব্যাখ্যা করা হয়, একটি দোভাষী , শেল। এর পৃথক ব্যাকরণগত অংশগুলি প্রোগ্রাম নয়। শেলটি চালানোর জন্য শেল ল্যাঙ্গুয়েজ (অন্যান্য) প্রোগ্রাম নির্দিষ্ট করার একটি উপায়।

[শেল ব্যাকরণের কোনও অপারেটরের মতো কোনও বিশেষ লেজিক্যাল উপাদান নয়। এটি একটি সাধারণ শব্দ , এটি এরকম একটি প্রোগ্রামের নাম দেয় [। অনেকগুলি শেলের শেল প্রোগ্রামের কোডে নিজেই একত্রিত হয়ে এই প্রোগ্রামটির অন্তর্নির্মিত সংস্করণ থাকে তবে আপনি এই নামে কোনও বাহ্যিক প্রোগ্রামও খুঁজে পেতে পারেন যেমন কোথাও /bin/[বা শেল ব্যতীত/usr/bin/[ কোন প্রোগ্রামগুলি আহ্বান করতে পারে। একইভাবে, বিশেষ শেল লেজিকাল উপাদানও নয়। এটি একটি সাধারণ শব্দ, এটি প্রোগ্রামের জন্য একটি আর্গুমেন্ট হয়ে ওঠে । প্রোগ্রাম প্রয়োজন যে তার চুড়ান্ত যুক্তি, যখন এটি কার্যকর হতে , যা এটি তারপর উপেক্ষা করার আয়।][[]

আপনার প্রশ্নের নাম অনুসারে এই জাতীয় আরও একটি প্রোগ্রাম echo। আবার বেশিরভাগ শেলের মধ্যে এই প্রোগ্রামটির অন্তর্নির্মিত সংস্করণ থাকে। তবে আবার প্রোগ্রামটির একটি বাহ্যিক সংস্করণও রয়েছে, কোথাও কোথাও শেল ছাড়াই অন্য প্রোগ্রামগুলির জন্য /bin/echoবা এর /usr/bin/echoজন্য ।

আপনার প্রশ্নের নাম অনুসারে একটি তৃতীয় প্রোগ্রাম ls। শেলগুলির সাধারণত এই প্রোগ্রামটির অন্তর্নির্মিত সংস্করণ থাকে না এবং এটি কোনও বহিরাগত প্রোগ্রাম, যেমন /bin/lsবা কোথাও খুঁজে পাওয়া যায় /usr/bin/ls

বোর্ন অ্যাগেইন শেলটির জন্য, আপনি জিএনইউ বোর্ন অ্যাগেইন শেল তথ্য ডকুমেন্টেশনের বেসিক শেল বৈশিষ্ট্যগুলিতে আরও এটি পড়তে পারেন । অন্যান্য শাঁসের বিভিন্ন ব্যাকরণ রয়েছে, স্বাভাবিকভাবেই। একক ইউনিক্স নির্দিষ্টকরণ একটি বাক্য গঠন যে সব POSIX-conformant শাঁস (তাদের POSIX-conformant মোড মধ্যে) মেনে চলে অনুমিত হয় বর্ণনা করা হয়েছে।

আরও পড়া

  • " শেল ব্যাকরণ "। শেল কমান্ড ভাষা । বেস স্পেসিফিকেশন ইস্যু 7. মুক্ত গ্রুপ। আইইইই 1003.1-2008। আইএসবিএন 1937218812।
  • testউপযোগিতা সমূহ । বেস স্পেসিফিকেশন ইস্যু 7. মুক্ত গ্রুপ। আইইইই 1003.1-2008। আইএসবিএন 1937218812।
  • " শেল ব্যাকরণ "। জেড শেল ম্যানুয়াল । সংস্করণ 5.3.1। 2017।

5

এটা আসলে কষ্টকল্পিত মনে নয় if, thenএবং elseবহিরাগত প্রোগ্রাম হিসাবে। প্রকৃতপক্ষে, মূল 1 ম সংস্করণ ইউনিক্সের থম্পসন শেল প্রয়োগ করেছে ifএবং gotoবাহ্যিক প্রোগ্রাম হিসাবে। এটি সম্ভব হয়েছে কারণ সাবপ্রসেসগুলি শেল প্রক্রিয়াটির সাথে ফাইল বর্ণনাকারীদের ভাগ করে দেয়, সুতরাং একটি (ফরোয়ার্ড) গেটোকে কেবলমাত্র লক্ষ্য লেবেল না পাওয়া এবং তারপরে বাইরে বের হওয়া অবধি ইনপুটটি পড়তে হয়েছিল। থম্পসন শেল দেখুন ।


অথবা প্রকৃতপক্ষে লরেন্ট বেরকোট ifএবং ifelseএর অংশগুলি দেখুন execlineifযদিও এগুলি প্রশ্নে নেই।
JdeBP

2
"বাহ্যিক প্রোগ্রামগুলির মতো কিনা, তা চিন্তা করা আসলে দূরের কথা নয়" ঠিক আছে, কারণ তারা তা নয়।
মনিকার সাথে লাইটনেস রেস

2

thenএবং elseপ্রোগ্রাম নয়। অন্যান্য অংশগুলি হল। লক্ষ্য করুন ;তাদের সরাসরি কোনও পরে নেই, তবে যে কমান্ডটি তারা আগে রয়েছে তার পরে।

[ ... ] হয় কমান্ড, এবং প্রয়োজন ;যদি অন্য কমান্ড শুরুতে অনুসরণ।

আফাইক, বাশের সমস্ত নিয়ন্ত্রণ কাঠামো এবং সম্ভবত বেশিরভাগ * নিক্স শেল একই রকম। তারা দোভাষীর নির্দেশাবলী। অন্যদিকে পরীক্ষা বা শর্তটি এমন একটি প্রোগ্রাম / প্রক্রিয়া ব্যবহার করে যা "এক্সিকিউটেড" এবং কমান্ড হয়। যেহেতু কমান্ডের thenদিকে নিয়ে যাওয়া লাইনের অংশ তাই echoএটি পূর্ববর্তী কমান্ড থেকে একটি নতুন লাইন দ্বারা পৃথক করতে হবে [ ... ]। এটা তোলে কমান্ড এটা নিয়ন্ত্রণ থেকে পৃথক করা হবে না echo yes

আইনত, যদিও কুরুচিপূর্ণ এবং পড়া শক্ত, তবে আপনি এটিও করতে পারেন।

if [ $VARIABLE == abcdef ]
then echo yes
else echo no
fi

লক্ষ্য করুন যে ;নিয়ন্ত্রণগুলির মধ্যে এখানে কোনও প্রয়োজন নেই, যদিও তারা নিজের লাইনে নেই।

আকর্ষণীয়ভাবে যথেষ্ট, পুরো নিয়ন্ত্রণ কাঠামো ( if ... fi) একটি শেল কমান্ড, এবং সম্পূর্ণরূপে একটি নতুন লাইন বা এ দিয়ে শেষ করতে হয় ;। শেষ লাইনটি fi echo doneকিন্তু হতে পারে না fi; echo done। একটি অ্যাসাইনমেন্ট হিসাবে একই VARIABLE='abcdef'কমান্ড।

যদিও পুরো নিয়ন্ত্রণ কাঠামো কমান্ড, তবুও তারা প্রোগ্রাম নয়।


1

if, elif, then, এবং fiসব সংরক্ষিত নির্মানের এক প্রয়োগ করতে ব্যবহৃত কীওয়ার্ড শেল একটি যৌগ কমান্ড, একটি কমান্ড (অথবা বরং, অন্য কমান্ড) শেল ঐ নামের কোনো দ্বারা হতে পারে না যার মানে যেমন উল্লেখ করা হয়। ;সাধারণের উদ্দেশ্য হ'ল কমান্ড পৃথক করা নয়, কমান্ড তালিকাটি সমাপ্ত করা । উদাহরণস্বরূপ, নিম্নলিখিতটি একটি বৈধ ifবিবৃতি:

if echo foo; echo bar; echo baz; then echo done; echo really done; fi

ifবিবৃতিটির শর্ত হ'ল কমান্ড তালিকা echo foo; echo bar; echo baz। পার্সার জানে যে শর্তটি শেষ হয়ে গেছে কারণ thenএটি অবিলম্বে একটি অর্ধ-কোলন অনুসরণ করে, এটি কোনও সংরক্ষিত কীওয়ার্ড বলে কোনও আদেশ হতে পারে না। সুতরাং, এটি জানে যে নিম্নলিখিতগুলি then দেহের শুরু। অনুরূপভাবে, fiএকটি সংরক্ষিত কীওয়ার্ড এবং সুতরাং এই ifবিবৃতিটির মূল অংশে তৃতীয় কমান্ড হতে পারে না , তবে যৌগিক আদেশের সমাপ্তি চিহ্নিত করে।


ধন্যবাদ, যদি এটি ব্যবহার করা হয় তবে if program1 foo; program2 bar; program3 baz; কোন প্রোগ্রামের স্থিতি হওয়া উচিত 0, যাতে শেলটি এগিয়ে যায় then? শেষটা?
ম্যাক্সিম কোরেটস্কিই

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