वास्तव में कार्यक्रम `if` और` `हैं


15

मैंने पढ़ा है कि अर्धविराम का उपयोग कार्यक्रमों को अलग करने के लिए किया जाता है:

$ echo 3; ls -la

क्या इसका मतलब यह है कि if, thenऔर elseयहां अलग-अलग कार्यक्रम हैं?

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

यह सवाल अर्धविराम के बारे में नहीं है।



1
@StephenRauch वास्तव में डुप्लिकेट नहीं है। अधिक यह उस क्यू से एक उचित परिणाम है, आगे की समझ पर एक प्रयास के रूप में।
user207673

अधिक प्रोग्रामम-वाई सूत्रीकरण:[ $variable == abcdef ] && echo yes || echo no
हेगन वॉन एटिजन

2
@ HagenvonEitzen कड़ाई से समकक्ष नहीं है, यदि पहली शाखा के भीतर का कथन विफल हो जाता है, तो दूसरा भी निष्पादित करेगा।
मॉर्गन

जवाबों:


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

बॉर्न अगेन शेल के लिए, आप GNU बॉर्न अगेन शेल इंफो डॉक्यूमेंटेशन के बेसिक शेल फीचर्स में इसके बारे में अधिक पढ़ सकते हैं । अन्य गोले में स्वाभाविक रूप से अलग-अलग व्याकरण होते हैं। एकल यूनिक्स विशिष्टता एक वाक्य रचना है कि सभी POSIX-conformant गोले (उनके POSIX-conformant मोड में) का पालन करने वाले हैं वर्णन करता है।

आगे की पढाई

  • " शैल व्याकरण "। शेल कमांड लैंग्वेज । बेस स्पेसिफिकेशन्स इशू 7. ओपन ग्रुप। IEEE 1003.1-2008। आईएसबीएन 1937218812।
  • testउपयोगिताएँ । बेस स्पेसिफिकेशन्स इशू 7. ओपन ग्रुप। IEEE 1003.1-2008। आईएसबीएन 1937218812।
  • " शैल व्याकरण "। जेड शैल मैनुअल । संस्करण 5.3.1। 2017।

5

यह वास्तव में दूर से प्राप्त किए गए के बारे में सोच नहीं है if, thenऔर elseबाहरी प्रोग्राम के रूप में। वास्तव में, मूल 1 संस्करण यूनिक्स में थॉम्पसन खोल लागू किया गया ifऔर gotoबाहरी कार्यक्रमों के रूप में। यह संभव है क्योंकि सबप्रोसेस शेयर शेल प्रक्रिया के साथ डिस्क्रिप्टर को फाइल करते हैं, इसलिए ए (फॉरवर्ड) गोटो को इनपुट तब तक पढ़ना पड़ता था जब तक कि वह लक्ष्य लेबल नहीं ढूंढता और फिर बाहर निकल जाता है। थॉम्पसन खोल देखें ।


या वास्तव में लॉरेंट Bercot देखते हैं ifऔर ifelseहै, जो के हिस्से हैं execline। ये ifसवाल में नहीं हैं , हालांकि।
J पर JDBP

2
"यह वास्तव में दूर के विचार नहीं है अगर, फिर और बाहरी कार्यक्रमों के रूप में" ठीक है, यह है, क्योंकि वे नहीं हैं।
लाइटनेस दौड़ मोनिका

2

thenऔर elseकार्यक्रमों नहीं कर रहे हैं। अन्य भाग हैं। सूचना ;उनके बाद सीधे ' नहीं ' है, लेकिन कमांड के बाद वे पूर्ववर्ती हैं।

[ ... ] है एक आदेश की आवश्यकता होती है ;, तो एक और आदेश की शुरुआत के बाद।

AFAIK, बाश में नियंत्रण संरचनाओं के सभी, और शायद सबसे * निक्स के गोले, समान हैं। वे दुभाषिया के लिए निर्देश हैं। दूसरी ओर, परीक्षण या स्थिति, एक प्रोग्राम / प्रक्रिया का उपयोग करता है जो "निष्पादित" है और कमांड हैं। चूँकि 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। कमांड की सूची की निकास स्थिति उस सूची में अंतिम कमांड की निकास स्थिति है। अन्य दो हालत को प्रभावित किए बिना विफल हो सकते हैं।
13
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.