क्या बैश में "गोटो" बयान है?


204

क्या बैश में "गोटो" कथन है? मुझे पता है कि यह बुरा अभ्यास माना जाता है, लेकिन मुझे विशेष रूप से "गोटो" की आवश्यकता है।


4
नहीं, वहाँ नहीं gotoहै हरामी (कम से कम यह command not foundमेरे लिए कहता है)। क्यों? संभावना है कि इसे करने का एक बेहतर तरीका है।
निकलैस बी।

153
उसके अपने कारण हो सकते हैं। मुझे यह प्रश्न इसलिए मिला क्योंकि मैं चाहता हूं कि gotoविभिन्न असंबंधित कार्यों को पूरा करने के लिए एक घंटे की प्रतीक्षा किए बिना एक बड़ी स्क्रिप्ट को डीबग करने के लिए बहुत सारे कोड को छोड़ दें। मैं निश्चित रूप gotoसे उत्पादन कोड में उपयोग नहीं करूंगा, लेकिन मेरे कोड को डीबग करने के लिए, यह मेरे जीवन को असीम रूप से आसान बना देगा, और जब इसे हटाने की बात आई तो इसे देखना आसान होगा।
कार्ल निकोल

30
@delnan लेकिन कोई गोटो नहीं होने से कुछ चीजें और अधिक जटिल हो सकती हैं। वास्तव में उपयोग के मामले हैं।
ग्लोगल

71
मैं इस गोटो मिथक से बीमार हूँ! गोटो के साथ कुछ भी गलत नहीं है! आप जो कुछ भी लिखते हैं वह अंततः गोटो हो जाता है। असेंबलर में, केवल गोटो है। उच्च प्रोग्रामिंग भाषाओं में गोटो का उपयोग करने का एक अच्छा कारण उदाहरण के लिए एक साफ और पठनीय तरीके से नेस्टेड छोरों से बाहर कूदना है।
अलेक्जेंडर Czutro

25
"गोटो से बचें" एक महान नियम है। किसी भी नियम की तरह, इसे तीन चरणों में सीखा जाना चाहिए। पहला: नियम का पालन तब तक करें जब तक कि वह दूसरी प्रकृति का न हो। दूसरा, नियम के कारणों को समझना सीखें। तीसरा, नियम के अच्छे अपवादों को जानें, नियम और नियम के कारणों का पालन करने की व्यापक समझ के आधार पर। उपरोक्त चरणों को छोड़ देने से बचें, जो "गोटो" का उपयोग करने जैसा होगा। ;-)
जेफ़ लीरमैन

जवाबों:


75

नहीं वहाँ नहीं है; देख §3.2.4 "यौगिक कमांड" में बैश संदर्भ मैनुअल नियंत्रण संरचनाओं कि के बारे में जानकारी के लिए करना अस्तित्व। विशेष रूप से, के उल्लेख पर ध्यान दें breakऔर continue, जो कि उतने लचीले नहीं हैं goto, लेकिन कुछ भाषाओं की तुलना में बैश में अधिक लचीले हैं, और जो आप चाहते हैं उसे प्राप्त करने में आपकी मदद कर सकते हैं। (जो भी यह है कि आप चाहते हैं।)


10
क्या आप "कुछ भाषाओं की तुलना में बैश में अधिक लचीले" पर विस्तार कर सकते हैं?
user239558

21
@ user239558: कुछ भाषाएं आपको केवल अंतरतम पाश से breakया उससे अनुमति देती हैं continue, जबकि बैश आपको यह निर्दिष्ट करने देता है कि लूप के कितने स्तर कूदने हैं। (और यहां तक ​​कि ऐसी भाषाएं जो आपको breakया continueमनमाने ढंग से छोरों से अनुमति देती हैं , सबसे अधिक आवश्यकता होती है कि उन्हें सांख्यिकीय रूप से व्यक्त किया जाए - जैसे, break foo;लेबल वाले लूप से टूट जाएगा foo- जबकि बैश में यह गतिशील रूप से व्यक्त किया गया है - जैसे, लूप से break "$foo"बाहर निकल जाएगा $foo। )
बर्बाद

मैं आवश्यक सुविधाओं के साथ कार्यों को परिभाषित करने और कोड के अन्य भागों से उन्हें शांत करने की सलाह दूंगा।
ब्लेमेयर

@ ब्रेख दरअसल, कई भाषाएं break LABEL_NAME;बश के घृणित होने के बजाय अनुमति देती हैं break INTEGER;
Sapphire_Brick

1
@Sapphire_Brick: हां, मैंने उस टिप्पणी का उल्लेख किया है जिसका आप जवाब दे रहे हैं।
बरबाद

124

यदि आप डिबगिंग के लिए एक बड़ी स्क्रिप्ट का हिस्सा छोड़ने के लिए इसका उपयोग कर रहे हैं (कार्ल निकोल की टिप्पणी देखें), तो अगर गलत एक अच्छा विकल्प हो सकता है (यह सुनिश्चित नहीं है कि "गलत" हमेशा उपलब्ध है, तो मेरे लिए यह / बिन / गलत है) :

# ... Code I want to run here ...

if false; then

# ... Code I want to skip here ...

fi

# ... I want to resume here ...

कठिनाई तब होती है जब आपके डिबगिंग कोड को चीरने का समय होता है। "अगर झूठ" निर्माण बहुत सीधा और यादगार है, लेकिन आप मिलान फाई कैसे ढूंढते हैं? यदि आपका संपादक आपको इंडेंट ब्लॉक करने की अनुमति देता है, तो आप स्किप किए गए ब्लॉक को इंडेंट कर सकते हैं (तब आप इसे तब वापस रखना चाहेंगे जब आप काम पूरा कर लें)। या फाई लाइन पर एक टिप्पणी, लेकिन यह कुछ ऐसा होगा जो आपको याद होगा, जो मुझे संदेह है कि बहुत प्रोग्रामर-निर्भर होगा।


6
हाँ falseहमेशा उपलब्ध है। लेकिन अगर आपके पास कोड का एक ब्लॉक है जिसे आप निष्पादित नहीं करना चाहते हैं, तो बस टिप्पणी करें। या इसे हटा दें (और अपने स्रोत नियंत्रण प्रणाली में देखें यदि आपको इसे बाद में पुनर्प्राप्त करने की आवश्यकता है)।
कीथ थॉम्पसन

1
यदि कोड के ithe ब्लॉक को एक बार में एक पंक्ति में टिप्पणी करने के लिए बहुत लंबा है, तो इन चालों को देखें। stackoverflow.com/questions/947897/… हालाँकि, ये किसी टेक्स्ट एडिटर को शुरुआत से अंत तक मैच करने में मदद नहीं करते हैं, या तो, इसलिए वे ज्यादा सुधार नहीं कर रहे हैं।
कैमिली गौडेयूस

4
"यदि गलत है" तो अक्सर कोड टिप्पणी करने से बेहतर है, क्योंकि यह सुनिश्चित करता है कि संलग्न कोड कानूनी कोड होना जारी है। कोड को कमेंट करने का सबसे अच्छा बहाना तब होता है जब उसे वास्तव में डिलीट करने की आवश्यकता होती है, लेकिन कुछ ऐसा है जिसे याद रखने की आवश्यकता है - इसलिए यह केवल एक टिप्पणी है, और अब "कोड" नहीं है।
जेफ लीमैन

1
मैं टिप्पणी का उपयोग करता हूं '# झूठी झूठी;' इस तरह मैं बस उस के लिए खोज कर सकता हूं और डिबग हटाने वाले खंड की शुरुआत और अंत दोनों पा सकता हूं।
जॉन

यह उत्तर नहीं दिया जाना चाहिए क्योंकि यह किसी भी तरह से ओपी के सवाल का जवाब नहीं देता है।
विक्टर जोरास

54

यह वास्तव में कुछ डिबग या प्रदर्शन की जरूरतों के लिए उपयोगी हो सकता है।

मैंने पाया कि बॉब कोपलैंड समाधान http://bobcopeland.com/blog/2012/10/goto-in-bash/ सुरुचिपूर्ण:

#!/bin/bash
# include this boilerplate
function jumpto
{
    label=$1
    cmd=$(sed -n "/$label:/{:a;n;p;ba};" $0 | grep -v ':$')
    eval "$cmd"
    exit
}

start=${1:-"start"}

jumpto $start

start:
# your script goes here...
x=100
jumpto foo

mid:
x=101
echo "This is not printed!"

foo:
x=${x:-10}
echo x is $x

का परिणाम:

$ ./test.sh
x is 100
$ ./test.sh foo
x is 10
$ ./test.sh mid
This is not printed!
x is 101

36
"विधानसभा भाषा की तरह बैश दिखने की मेरी तलाश कभी पूरी होने के करीब आती है।" - वाह। बस वाह।
ब्रायन एग्न्यू

5
केवल एक चीज जो मैं बदलूंगा वह यह है कि लेबल ऐसे शुरू हों : start:ताकि वे सिंटैक्स त्रुटियां न हों।
एलेक्सी मगुर

5
बेहतर होगा अगर आपने ऐसा किया: cmd = $ (sed -n "/ # $ label: / {: a; n; p; ba};" $ 0 | grep -v ': $') लेबल के साथ शुरू होने वाला: # प्रारंभ: => यह स्क्रिप्ट त्रुटियों को रोक देगा
एक्सेस

2
हम्म, वास्तव में यह मेरी गलती की संभावना है। मैंने पोस्ट को एडिट किया है। धन्यवाद।
हबबिटस

2
set -xसमझने में मदद करता है कि क्या हो रहा है
जॉन लिन

30

आप caseकिसी गोटो को अनुकरण करने के लिए बैश में उपयोग कर सकते हैं :

#!/bin/bash

case bar in
  foo)
    echo foo
    ;&

  bar)
    echo bar
    ;&

  *)
    echo star
    ;;
esac

पैदा करता है:

bar
star

4
ध्यान दें कि यह आवश्यक है bash v4.0+। हालांकि, यह सामान्य उद्देश्य नहीं है, लेकिन बयान के gotoलिए एक गिरावट के माध्यम से विकल्प है case
mklement0

3
मुझे लगता है कि इसका जवाब होना चाहिए। मुझे दिए गए निर्देश से स्क्रिप्ट के फिर से शुरू निष्पादन का समर्थन करने के लिए जाने की वास्तविक आवश्यकता है। यह हर तरह से है, लेकिन अर्थ, गोटो, और शब्दार्थ और वाक्यविन्यास शर्करा प्यारा है, लेकिन कड़ाई से आवश्यक नहीं है। महान समाधान, IMO।
नथान जी

1
@nathang, यह है कि क्या उत्तर पर अपने मामले सामान्य मामले ओपी के बारे में पूछा की सबसेट के साथ जाल करने के लिए होता है कि क्या निर्भर करता है। दुर्भाग्य से, सवाल सामान्य मामले के बारे में पूछता है, जिससे यह उत्तर बहुत संकीर्ण हो जाता है। (क्या उस प्रश्न को बहुत व्यापक रूप से बंद किया जाना चाहिए क्योंकि यह एक अलग चर्चा है)।
चार्ल्स डफी

1
गोटो सेलेक्ट करने से ज्यादा है। गोटो फीचर का मतलब है कि कुछ परिस्थितियों में रिकॉर्डिंग करने में सक्षम होना, प्रवाह की तरह एक लूप बनाना ...
सर्जियो अब्रेउ

19

यदि आप बैश स्क्रिप्ट का परीक्षण / डिबगिंग कर रहे हैं, और बस एक या एक से अधिक कोड के पिछले भाग को छोड़ना चाहते हैं, तो यह करने का एक बहुत ही सरल तरीका है जो बाद में ढूंढना और निकालना बहुत आसान है (अधिकांश विधियों के विपरीत) ऊपर वर्णित)।

#!/bin/bash

echo "Run this"

cat >/dev/null <<GOTO_1

echo "Don't run this"

GOTO_1

echo "Also run this"

cat >/dev/null <<GOTO_2

echo "Don't run this either"

GOTO_2

echo "Yet more code I want to run"

अपनी स्क्रिप्ट को वापस सामान्य करने के लिए, बस किसी भी लाइन को हटा दें GOTO

हम gotoएक उपनाम के रूप में एक कमांड जोड़कर, इस समाधान को भी पूर्व निर्धारित कर सकते हैं :

#!/bin/bash

shopt -s expand_aliases
alias goto="cat >/dev/null <<"

goto GOTO_1

echo "Don't run this"

GOTO_1

echo "Run this"

goto GOTO_2

echo "Don't run this either"

GOTO_2

echo "All done"

उपनाम आमतौर पर बैश स्क्रिप्ट में काम नहीं करते हैं, इसलिए हमें shoptइसे ठीक करने के लिए कमांड की आवश्यकता है।

यदि आप अपने सक्षम / अक्षम करने में सक्षम होना चाहते हैं goto, तो हमें थोड़ा और अधिक चाहिए:

#!/bin/bash

shopt -s expand_aliases
if [ -n "$DEBUG" ] ; then
  alias goto="cat >/dev/null <<"
else
  alias goto=":"
fi

goto '#GOTO_1'

echo "Don't run this"

#GOTO1

echo "Run this"

goto '#GOTO_2'

echo "Don't run this either"

#GOTO_2

echo "All done"

फिर आप export DEBUG=TRUEस्क्रिप्ट चलाने से पहले कर सकते हैं ।

लेबल टिप्पणी कर रहे हैं, तो वाक्यविन्यास त्रुटियों का कारण नहीं होगा अगर हमारे goto( "नहीं goto' से सेटिंग करके) अक्षम है :, लेकिन इसका मतलब है कि हम उन्हें हमारे में उद्धृत करने की आवश्यकता हैgoto बयानों ।

जब भी gotoआप किसी भी तरह के समाधान का उपयोग करते हैं, तो आपको सावधान रहने की आवश्यकता है कि जिस कोड को आप अतीत में कूद रहे हैं, वह किसी भी चर को सेट नहीं करता है जिसे आप बाद में भरोसा करते हैं - आपको अपनी परिभाषा के शीर्ष पर, या बस एक के ऊपर उन परिभाषाओं को स्थानांतरित करने की आवश्यकता हो सकती है। आपके gotoबयानों की


गोटो के अच्छे / बुरे-नेस में शामिल हुए बिना, लॉरेंस का समाधान सिर्फ ठंडा है। आपको मेरा वोट मिला।
मोगेंस ट्रैशर्डके डिक

1
यह एक स्किप-टू की तरह अधिक है, if(false)अधिक समझ बनाने के लिए प्रतीत होता है (मेरे लिए)।
vesperto

2
गोटो "लेबल" का हवाला देने का अर्थ यह भी है कि यहाँ-डॉक का विस्तार / मूल्यांकन नहीं किया गया है, जो आपको कुछ मुश्किल से बचाने के लिए बग ढूंढता है (अयोग्य, यह निम्न होगा: पैरामीटर विस्तार, कमांड प्रतिस्थापन और अंकगणितीय विस्तार, जो सभी हो सकते हैं दुष्प्रभाव)। आप इसे थोड़ा ट्विस्ट भी कर सकते हैं alias goto=":<<"और catपूरी तरह से डिस्पेंस कर सकते हैं।
mr.spuratic

हाँ, vesperto, आप 'if' स्टेटमेंट का उपयोग कर सकते हैं, और मैंने ऐसा कई लिपियों में किया है, लेकिन यह बहुत गन्दा है और इसे नियंत्रित करना और इसे ट्रैक करना बहुत कठिन है, खासकर यदि आप अपने जम्प पॉइंट्स को बार-बार बदलना चाहते हैं।
लॉरेंस रेनशॉ

12

यद्यपि अन्य लोगों ने पहले ही स्पष्ट कर दिया है कि gotoबैश में कोई प्रत्यक्ष समकक्ष नहीं है (और निकटतम विकल्प जैसे कि फ़ंक्शन, लूप और ब्रेक प्रदान किए गए हैं), मैं यह बताना चाहूंगा कि कैसे लूप प्लस का उपयोग करके breakएक विशिष्ट प्रकार के गोटो स्टेटमेंट का अनुकरण किया जा सकता है।

जिस स्थिति में मुझे यह सबसे अधिक उपयोगी लगता है, वह यह है कि जब कुछ शर्तों को पूरा नहीं किया जाता है तो मुझे कोड के एक खंड की शुरुआत में लौटने की आवश्यकता होती है। नीचे दिए गए उदाहरण में, जबकि लूप हमेशा के लिए चलेगा जब तक पिंग पैकेट्स को टेस्ट आईपी पर रोक नहीं देता।

#!/bin/bash

TestIP="8.8.8.8"

# Loop forever (until break is issued)
while true; do

    # Do a simple test for Internet connectivity
    PacketLoss=$(ping "$TestIP" -c 2 | grep -Eo "[0-9]+% packet loss" | grep -Eo "^[0-9]")

    # Exit the loop if ping is no longer dropping packets
    if [ "$PacketLoss" == 0 ]; then
        echo "Connection restored"
        break
    else
        echo "No connectivity"
    fi
done

7

इस समाधान में निम्नलिखित समस्याएं थीं:

  • अंधाधुंध एक में समाप्त होने वाली सभी कोड लाइनों को हटा देता है :
  • label:लेबल के रूप में एक पंक्ति में कहीं भी व्यवहार करता है

यहाँ एक निश्चित ( shell-checkसाफ) संस्करण है:


#!/bin/bash

# GOTO for bash, based upon https://stackoverflow.com/a/31269848/5353461
function goto
{
 local label=$1
 cmd=$(sed -En "/^[[:space:]]*#[[:space:]]*$label:[[:space:]]*#/{:a;n;p;ba};" "$0")
 eval "$cmd"
 exit
}

start=${1:-start}
goto "$start"  # GOTO start: by default

#start:#  Comments can occur after labels
echo start
goto end

  # skip: #  Whitespace is allowed
echo this is usually skipped

# end: #
echo end

6

वांछित परिणाम प्राप्त करने की एक और क्षमता है: कमांड trap। इसका उपयोग उदाहरण के लिए साफ-सफाई के उद्देश्यों के लिए किया जा सकता है।


4

कोई नहीं है 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कथन का उपयोग करने पर विचार करें ।

यदि आप अपने लंबे कोड को छोटे टुकड़ों में अलग कर सकते हैं, तो इसे अलग-अलग फ़ाइलों में स्थानांतरित करने पर विचार करें और उन्हें मूल स्क्रिप्ट से कॉल करें।


इस फ़ॉर्म और सामान्य फ़ंक्शन के बीच क्या अंतर हैं?
युरेनचेन

2
@ युरेनचेन - कोड प्रवाह में परिवर्तन को प्राप्त करने के लिए trapउपयोग exception handlingकरने के बारे में सोचें । इस मामले में जाल कुछ भी पकड़ रहा है जो स्क्रिप्ट का कारण बनता है EXIT, जो गैर-मौजूद कमांड को लागू करने से शुरू होता है goto। BTW: तर्क goto trapकुछ भी हो सकता है, goto ignoredक्योंकि यह ऐसा है gotoजो EXIT का कारण बनता है, और 2>/dev/nullत्रुटि संदेश को यह कहते हुए छुपाता है कि आपकी स्क्रिप्ट बाहर निकल रही है।
जेसी चिशोल्म

2

यह हुबबिटस द्वारा लगाई गई जूडी श्मिट स्क्रिप्ट का एक छोटा सुधार है।

स्क्रिप्ट में गैर-बचा हुआ लेबल डालना मशीन पर समस्याग्रस्त था और यह दुर्घटना का कारण बना। लेबल से बचने के लिए # जोड़कर हल करना काफी आसान था। उनके सुझावों के लिए अलेक्सज मगुरा और access_granted का धन्यवाद।

#!/bin/bash
# include this boilerplate
function goto {  
label=$1
cmd=$(sed -n "/$#label#:/{:a;n;p;ba};" $0 | grep -v ':$')
eval "$cmd"
exit
}

start=${1:-"start"}

goto $start

#start#
echo "start"
goto bing

#boom#
echo boom
goto eof

#bang#
echo bang
goto boom

#bing#
echo bing
goto bang

#eof#
echo "the end mother-hugger..."

यह कॉपी पेस्ट काम नहीं कर रहा है => अभी भी एक जुमला है।
एलेक्सिस पेस

इसका क्या मतलब है? क्या काम नहीं कर रहा है? क्या आप अधिक विस्तार से बताएंगे?
thebunnyrules

बेशक मैंने कोड की कोशिश की! मैंने सभी सफल पोस्ट करने से पहले 5 या 6 अलग-अलग परिस्थितियों में परीक्षण किया। कोड आपके लिए कैसे विफल हो गया, क्या त्रुटि संदेश या कोड?
thebunnyrules

कुछ भी हो मैन। मैं आपकी मदद करना चाहता हूं, लेकिन आप वास्तव में अस्पष्ट और अनौपचारिक हो रहे हैं (उस अपमान का उल्लेख नहीं करने के लिए "क्या आपने इस प्रश्न का परीक्षण किया है")। "आपने सही अर्थ में पेस्ट नहीं किया" क्या होता है? यदि आप "/ $ # लेबल #: / {: a; n; p; ba}" का जिक्र कर रहे हैं; " भाग, मैं बहुत जागरूक हूँ कि यह अलग है। मैंने इसे नए लेबल प्रारूप (उर्फ # लेबल # बनाम: अन्य उत्तर में लेबल जो कुछ मामलों में स्क्रिप्ट को क्रैश कर रहा था) के लिए संशोधित किया। क्या आपको मेरे उत्तर (जैसे स्क्रिप्ट क्रैश या खराब सिंटैक्स) के साथ कुछ वैध समस्या है या क्या आपने सिर्फ मेरा जवाब दिया है क्योंकि आपने सोचा था कि "मुझे नहीं पता कि कैसे कट और पेस्ट करना है"?
thebunnyrules

1
@thebunnyrules मैं आप के रूप में एक ही मुद्दे में भाग गया, लेकिन यह आपके समाधान के लिए
फैबी

2

डिबगिंग के दौरान कोड ब्लॉक को कमेंट करने के उपयोग के लिए एक सरल खोज योग्य गोटो।

GOTO=false
if ${GOTO}; then
    echo "GOTO failed"
    ...
fi # End of GOTO
echo "GOTO done"

परिणाम है-> GOTO किया


1

मुझे कार्यों का उपयोग करने का एक तरीका पता चला।

कहते हैं, उदाहरण के लिए, आप 3 विकल्प हैं: A, B, और CAऔर Bएक कमांड निष्पादित करें, लेकिन Cआपको अधिक जानकारी देता है और आपको फिर से मूल संकेत पर ले जाता है। यह फ़ंक्शन का उपयोग करके किया जा सकता है।

ध्यान दें कि चूंकि लाइन कॉन्टैग function demoFunctionकेवल फ़ंक्शन सेट कर रहा है, इसलिए आपको demoFunctionउस स्क्रिप्ट के बाद कॉल करना होगा ताकि फ़ंक्शन वास्तव में चलेगा।

आप आसानी से कई अन्य फ़ंक्शन लिखकर और उन्हें कॉल कर सकते हैं यदि आपको GOTOअपनी शेल स्क्रिप्ट में एक और जगह " " चाहिए।

function demoFunction {
        read -n1 -p "Pick a letter to run a command [A, B, or C for more info] " runCommand

        case $runCommand in
            a|A) printf "\n\tpwd being executed...\n" && pwd;;
            b|B) printf "\n\tls being executed...\n" && ls;;
            c|C) printf "\n\toption A runs pwd, option B runs ls\n" && demoFunction;;
        esac
}

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