बैश केस स्टेटमेंट के अंत में "esac" का क्या अर्थ है? क्या इसकी आवश्यकता है?


55

मुझे "एशैक" के कई उदाहरण मिले हैं, जो एक मारपीट मामले के बयान के अंत में दिखाई दे रहे हैं, लेकिन मुझे इसके उपयोग पर कोई स्पष्ट दस्तावेज नहीं मिला है। मैन पेज इसका उपयोग करता है, और यहां तक ​​कि शब्द ( https://www.gnu.org/software/bash/manual/bashref.html#index-esac ) पर एक सूचकांक है , लेकिन यह परिभाषित नहीं है कि यह उपयोग है। क्या केस स्टेटमेंट, सर्वश्रेष्ठ अभ्यास या शुद्ध तकनीक को समाप्त करने के लिए यह आवश्यक तरीका है?


2
esacअंक के लिए सूचकांक प्रविष्टि बिल्कुल जहां यह होना चाहिए - उस रेखा को जो इसे परिभाषित करता है और दिखाता है कि इसकी आवश्यकता है।
होब्स

@ ओह, आप सही हैं कि सूचकांक उस रेखा को इंगित करता है जो इसके उपयोग को दिखाता है लेकिन यह इसे किसी भी तरह से परिभाषित नहीं करता है, विशेष रूप से जिस तरह से यह अन्य वर्णों के उपयोग का वर्णन करता है, उसकी तुलना में "|" या ";" या ";;" अब जब मैंने जवाब (ओं) को पढ़ा है, तो पीछे की ओर वर्तनी "केस" कमांड को समाप्त करने के लिए ऐसा वास्तविक मानक प्रतीत होता है कि अधिकांश अनुभवी उपयोगकर्ता इसे स्वीकार कर लेंगे।
GrnMtnBuckeye

यदि आपके पास esacया ऐसा कुछ नहीं है , तो आपको कैसे लगता है कि यह बता पाएगा कि caseकथन का अंत कहाँ है?
बरमार

यह की वाक्य रचना का हिस्सा होने के रूप में परिभाषित करता caseबयान, एक ही रास्ता है कि में else, elifऔर fiएक की वाक्य रचना का हिस्सा माना जाता है ifबयान। इसका अपना कोई शब्दार्थ नहीं है, इसलिए इसके बारे में कहने के लिए कुछ भी नहीं है, लेकिन यह एक caseबयान की परिभाषा के अंत में है , इसलिए यह वह जगह है जहां एक caseबयान समाप्त होता है। तथ्य यह है कि यह caseपीछे की ओर वर्तनी है एक सुविधाजनक जिज्ञासा है, लेकिन कंप्यूटर परवाह नहीं करता है, यह सिर्फ जानता है कि यह एक निश्चित शब्द की तलाश में है।
होबस

1
@hobbs "... इसके बारे में कहने के लिए कुछ भी नहीं है ..." अभी तक आपने सिर्फ स्पष्टीकरण का एक पैराग्राफ लिखा है कि इसके बारे में कहने के लिए कुछ क्यों नहीं है। महत्वपूर्ण बात यह है कि "एसैक" के इरादे को समझना चाहिए। यही कारण है कि इस सवाल का सीधा जवाब अपवित्र संख्या के साथ है।
एंजेलो

जवाबों:


99

के fiलिए ifऔर के doneलिए की तरह for, esacएक caseबयान को समाप्त करने के लिए आवश्यक तरीका है ।

esacहै caseपिछड़े वर्तनी, बल्कि पसंद fiहै ifपिछड़े वर्तनी। मुझे नहीं पता कि एक forब्लॉक को समाप्त करने वाला टोकन क्यों नहीं है rof


33
आपका मतलब है कि odएक doब्लॉक को समाप्त करना क्यों नहीं है ? :)
वाइल्डकार्ड

4
\odउस उपयोगिता का उपयोग करने के लिए हर बार टाइप करने की कल्पना करें! जो दुर्लभ है, लेकिन मेरी बात खड़ी है;)
स्कोर_उंडर

2
आपको 666 से बाहर निकाल दिया। आपका स्वागत है: P और शानदार जवाब!
द वंडरर

12
@Wildcard यह fiऔर नहीं है neht, इसलिए सादृश्य से यह rof(या elihw) और od( नहीं , ज़ाहिर है, odपहले से ही लिया गया है) होगा ... लेकिन शायद यह सबसे आत्म-असंगत भाषाओं में से एक से बहुत अधिक आत्म-संगतता की उम्मीद कर रहा है वहाँ है।
zwol

1
ROTFL और कुछ नहीं कहना है
gerhard d।

55

esacकीवर्ड वास्तव में एक आवश्यक सीमांकक एक को समाप्त करने के caseमें बयान bashऔर सबसे गोले छोड़कर यूनिक्स / लिनक्स पर इस्तेमाल cshपरिवार।

मूल बॉर्न शेल स्टीव बॉर्न द्वारा बनाया गया था जो पहले ALGOL68 पर काम करते थे । इस भाषा ने इस उलट शब्द तकनीक का आविष्कार ब्लॉक को परिसीमित करने के लिए किया था।

case/esac

if/fi

do/od

उत्तरार्द्ध कोई और नहीं do/odबल्कि do/doneबॉर्न और सभी व्युत्पन्न गोले शामिल हैं, bashक्योंकि odइसकी स्थापना के समय से ही यूनिक्स कमांड के रूप में पहले से ही मौजूद था ( ctal d ump )।

ध्यान दें कि do/doneकार्यात्मक ब्लॉक द्वारा या तो शुरू की कर रहे हैं for, whileया untilनिर्देश। for, whileऔर पर्याप्त के untilरूप doneमें समाप्त करने की आवश्यकता नहीं है। यही कारण है कि काल्पनिक rofऔर elihwटोकन की कोई आवश्यकता नहीं है ।


6

" esac" कोड-ब्लॉक " caseबनाने के लिए " " एक पूर्व को समाप्त करता है "।

Algol68 में उनका उपयोग किया जाता है, आम तौर पर परिचय कीवर्ड के उल्टे चरित्र अनुक्रम को बाड़े को समाप्त करने के लिए उपयोग किया जाता है, आदि। ( if ~ then ~ else ~ fi, case ~ in ~ out ~ esac, for ~ while ~ do ~ od ).

मैं उन्हें "गार्डेड ब्लॉक" कहलाऊंगा, जो कि एग्जर डिक्स्ट्रा और उनकी गार्डेड कमांड लैंग्वेज के बाद होगा

odसंभवतः यूनिक्स "ओड" कमांड के पूर्व-अस्तित्व के कारण बॉर्न शेल में उपयोग नहीं किया गया था ।

इतिहास:

"संरक्षित ब्लॉक" विचार ALGOL 68 जैसे अंग्रेजी से आया है :

proc days in month = (int year, month)int:

  case month in
    31,
    if year mod 4=0  year mod 1000    year mod 400=0 then 29 else 28 fi,
    31, 30, 31, 30, 31, 31, 30, 31, 30, 31
  esac;

सोवियत के अल्गोल 68 एलजीयू कार्यान्वयन ने ऐसा ही किया: अंग्रेजी में अल्गोल 68 के श्रद्धालु केस स्टेटमेंट को पढ़ता है case ~ in ~ out ~ esac, सिरिलिक में यह पढ़ता है выб ~ в ~ либо ~ быв

फिर 1975 में Algol68 के कोड-ब्लॉक उनकी गार्डेड कमांड लैंग्वेज के लिए Edsger Dijkstra द्वारा लिए गए । जैसे

if a  b  max := a
| b  a  max := b
fi

मुमकिन है Dijstra काबू पाने के लिए "पहरा ब्लाकों" का इस्तेमाल किया झूलने किसी और अस्पष्टता में लागू Algol60 और में तो फिर से इंजीनियर सी प्रोग्रामिंग भाषा । (cf. पारी-कम संघर्ष। )

अंत में - Algol68 से - " esac" यह 1977 में बनाया बॉर्न शैल (जहां की खोज esac) के सौजन्य से स्टीफन आर बॉर्न जो एक प्रारंभिक Algol68 संकलक कहा जाता विकसित की थी ALGOL 68C

पारिवारिक रूप से स्टीफन ने मैक्रो.एच नामक "सी हेडर फ़ाइल" में भी इन्हीं गार्डेड ब्लॉक्स का उपयोग किया था

#define IF  if(
#define THEN    ){
#define ELSE    } else {
#define ELIF    } else if (
#define FI  ;}

उल्लेखनीय सॉफ्टवेयर जीनियस लैंडोन कर्ट नोल और लैरी बेसल ने 1984 में स्टीव के मैक्रो.एचडी कोड पर ठोकर खाई, जबकि नेशनल सेमीकंडक्टर के जीनिक्स पोर्टिंग समूह में कार्यरत थे और इसके आवेदन को समझने के लिए संघर्ष किया। और इसलिए लैंडन और लैरी ने तब इंटरनेशनल ओब्सेस्ड सी कोड कॉन्टेस्ट बनाया ...

1984 से लेकर आज तक कई हजार अन्य "बेहतर" प्रोग्रामिंग भाषाएं हैं जो कि दिक्जस्ट्रा के गार्डेड कमांड का उपयोग नहीं करती हैं। और स्टीवन बॉर्न के उपयोग के बारे में उन्हें macro.hअक्सर आईटी के "सॉफ्टवेयर डेवलपमेंट डिस्क्रिप्शन" में उद्धृत किया जाता है, क्योंकि वे व्याख्यान में सो नहीं रहे थे। :-)


क्या है case out? उस वाक्य रचना को कभी नहीं देखा
Dani_l

1
@Dani_l यह अल्गोल68 सिंटेक्स है जो बॉर्न शेल द्वारा नहीं अपनाया गया है।
जलियागरे

odअगर इसे पहले ही नहीं लिया गया था, तो भी वे इसे क्यों कहेंगे ? यह नहीं होगा rofया elihw?
flarn2006

पिकिंग do ~ od, if ~ fiऔर case ~ esacइसका सीधा सा मतलब है कि अंडरगार्मेंट्स की अंतहीन भावी पीढ़ियाँ Algol68 को पॉज करने में सक्षम होंगी और Algol68 की एक साधारण "समालोचना" को उनकी अंतिम वर्ष की परियोजना में जोड़ेगी, वास्तव में Algol68 कोड के एक पृष्ठ (लाइन) को लिखने के बिना?
NevilleDNZ

1

हाँ, यह आवश्यक है। जैसा कि जैकब ऊपर बताते हैं, इसका तर्क if/ के समान है fi। पारंपरिक सी टिप्पणी करता है /*और */भी इसी तरह की जोड़ी बनाता है। क्योंकि C को इसलिए लिखा गया था ताकि Unix ज्यादातर C में लिखा जा सके, जिसमें कम से कम असेंबली कोड हो, जिसमें C और Unix डेवलपमेंट टीमों के बीच एक बड़ा ओवरलैप हो, यह धारणा का एक सामान्य स्रोत मान लेना उचित है कि एक बहु के बराबर -च्रेकर ब्लॉक सीमांकक रिवर्स ऑर्डर में वर्णों का समान अनुक्रम होना चाहिए।

इसके विपरीत, लूप्स जैसे for, whileऔर untilउपयोग do... doneचरित्र क्रम को उलटने के बजाय, इसलिए कुछ असंगति है।


3
सिंटेक्स बॉर्न से आया था, जो फिर से ALGOL से प्रेरित था।
रनियम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.