कोई नहीं है goto
बैश में है।
यहाँ कुछ गंदे वर्कअराउंड का उपयोग किया गया है trap
जो केवल पीछे की ओर कूदता है :)
#!/bin/bash -e
trap '
echo I am
sleep 1
echo here now.
' EXIT
echo foo
goto trap 2> /dev/null
echo bar
आउटपुट:
$ ./test.sh
foo
I am
here now.
इसका उपयोग उस तरह से नहीं किया जाना चाहिए, लेकिन केवल शैक्षिक उद्देश्यों के लिए। यहाँ क्यों यह काम करता है:
trap
कोड प्रवाह में परिवर्तन को प्राप्त करने के लिए अपवाद हैंडलिंग का उपयोग कर रहा है। इस मामले में trap
कुछ भी पकड़ रहा है जो स्क्रिप्ट को बाहर करने का कारण बनता है। आदेश goto
मौजूद नहीं है, और इसलिए एक त्रुटि फेंकता है, जो आमतौर पर स्क्रिप्ट से बाहर निकल जाएगा। यह त्रुटि पकड़ी जा रही है trap
, और 2>/dev/null
त्रुटि संदेश छुपाता है जो आमतौर पर प्रदर्शित किया जाएगा।
गोटो का यह कार्यान्वयन स्पष्ट रूप से विश्वसनीय नहीं है, क्योंकि कोई भी गैर-मौजूद कमांड (या उस तरीके के लिए कोई अन्य त्रुटि), उसी ट्रैप कमांड को निष्पादित करेगा। विशेष रूप से, आप यह नहीं चुन सकते कि कौन सा लेबल गो-टू में जाए।
मूल रूप से वास्तविक परिदृश्य में आपको किसी भी बयान की आवश्यकता नहीं है, वे विभिन्न स्थानों पर यादृच्छिक कॉल के रूप में निरर्थक हैं, केवल आपके कोड को समझना मुश्किल है।
यदि आपका कोड कई बार लाया जाता है, तो उपयोग करने के लिए लूप और उसके वर्कफ़्लो को बदलने पर विचार करें continue
और break
।
यदि आपका कोड इसे स्वयं दोहराता है, तो फ़ंक्शन लिखने और इसे जितनी बार चाहें कॉल करने पर विचार करें।
यदि आपके कोड को चर मान के आधार पर विशिष्ट अनुभाग में कूदने की आवश्यकता है, तो case
कथन का उपयोग करने पर विचार करें ।
यदि आप अपने लंबे कोड को छोटे टुकड़ों में अलग कर सकते हैं, तो इसे अलग-अलग फ़ाइलों में स्थानांतरित करने पर विचार करें और उन्हें मूल स्क्रिप्ट से कॉल करें।
goto
है हरामी (कम से कम यहcommand not found
मेरे लिए कहता है)। क्यों? संभावना है कि इसे करने का एक बेहतर तरीका है।