বাশে কি "গোটো" স্টেটমেন্ট আছে?


204

বাশে কোনও "গোটো" বিবৃতি আছে? আমি জানি এটি খারাপ অভ্যাস হিসাবে বিবেচিত হয় তবে আমার বিশেষভাবে "গোটো" দরকার।


4
না, gotoবাশে নেই (অন্তত এটি আমার command not foundজন্য বলে ) কেন? সম্ভাবনা রয়েছে এটি করার আরও ভাল উপায়।
নিক্লাস বি।

153
তার কারণ থাকতে পারে। আমি এই প্রশ্নটি খুঁজে পেয়েছি কারণ আমি gotoবিভিন্ন অপ্রাসঙ্গিক কাজ শেষ হওয়ার জন্য এক ঘন্টা অপেক্ষা না করেই একটি বৃহত স্ক্রিপ্ট ডিবাগ করার জন্য প্রচুর কোড ছাড়তে একটি বিবৃতি চাই । আমি অবশ্যই gotoপ্রোডাকশন কোডটিতে একটি ব্যবহার করব না , তবে আমার কোডটি ডিবাগ করার জন্য এটি আমার জীবনকে অসীম সহজতর করে তুলবে এবং এটি সরিয়ে দেওয়ার সময় স্পষ্ট হওয়া সহজ হবে।
কার্ল নিকল

30
@ ডেলান কিন্তু তবে কিছু না পেয়ে কিছু বিষয়কে আরও জটিল করে তুলতে পারে। প্রকৃতপক্ষে ব্যবহারের ক্ষেত্রে আছে।
glglgl

71
আমি এই গীতকথার অসুস্থ! গোটোতে কোন ভুল নেই! আপনি যা কিছু লিখেন তা শেষ পর্যন্ত গোটো হয়ে যায়। এসেম্বলারের মধ্যে কেবল গোটো রয়েছে। উচ্চতর প্রোগ্রামিং ভাষাগুলিতে গোটো ব্যবহার করার একটি ভাল কারণ উদাহরণস্বরূপ একটি পরিষ্কার এবং পঠনযোগ্য উপায়ে নেস্টেড লুপগুলি থেকে ঝাঁপিয়ে পড়া।
আলেকজান্ডার জজুতরো

25
"এড়িয়ে চলুন" একটি দুর্দান্ত নিয়ম। যে কোনও নিয়মের মতো এটিও তিনটি পর্যায়ে শিখতে হবে। প্রথম: এটি দ্বিতীয় প্রকৃতি না হওয়া পর্যন্ত নিয়মটি অনুসরণ করুন। দ্বিতীয়ত, নিয়মের কারণগুলি বুঝতে শিখুন। তৃতীয়ত, নিয়মটি কীভাবে অনুসরণ করতে হবে এবং বিধি সম্পর্কিত কারণগুলি সম্পর্কে একটি বিস্তৃত বোঝার ভিত্তিতে, নিয়মের ভাল ব্যতিক্রমগুলি শিখুন। উপরের পদক্ষেপগুলি এড়িয়ে চলুন, যা "গোটো" ব্যবহারের মতো হবে। ;-)
জেফ লারম্যান

উত্তর:


75

কোন নেই; দেখতে §3.2.4 "চক্রবৃদ্ধি কমান্ড" মধ্যে ব্যাশ রেফারেন্স ম্যানুয়াল নিয়ন্ত্রণ কাঠামো যে সম্পর্কে তথ্যের জন্য কি করতে বিদ্যমান। বিশেষত, এর উল্লেখটি লক্ষ্য করুন breakএবং continue, যা ততটা নমনীয় নয় goto, তবে কিছু ভাষার চেয়ে বাশের চেয়ে আরও নমনীয় এবং আপনি যা চান তা অর্জনে সহায়তা করতে পারে। (যাই হোক না কেন এটি আপনি চান। ...)


10
আপনি কি "কিছু ভাষার চেয়ে বাশে আরও নমনীয়" উপর প্রসারিত করতে পারেন?
ব্যবহারকারী 239558

21
@ ব্যবহারকারী 239558: কিছু ভাষাগুলি আপনাকে কেবল অন্তর্লীন লুপে যেতে breakবা প্রবেশাধিকার দেয় continue, তবে বাশ আপনাকে কত স্তরের লুপটি লাফিয়ে সুনির্দিষ্ট করতে দেয়। (এবং এমন ভাষাও যা আপনাকে স্বেচ্ছাচারী লুপগুলিতে breakবা তার continueথেকে অনুমতি দেয় , বেশিরভাগের প্রয়োজন স্থিরভাবে প্রকাশ করা প্রয়োজন - উদাহরণস্বরূপ, break foo;লেবেলযুক্ত লুপটি ভেঙে যাবে foo- যেখানে বাশে এটি গতিশীলভাবে প্রকাশ করা হয়েছে - যেমন, লুপগুলি break "$foo"ভেঙে যাবে) $foo। )
রুখ

আমি প্রয়োজনীয় বৈশিষ্ট্যগুলি সহ ফাংশনগুলি সংজ্ঞায়িত করার এবং কোডের অন্যান্য অংশ থেকে তাদের কল করার পরামর্শ দেব।
blmayer

@রুখ আসলে, অনেকগুলি ভাষা break LABEL_NAME;বাশের ঘৃণ্য হওয়ার পরিবর্তে অনুমতি দেয় break INTEGER;
নীলা_ ইট

1
@ সাফায়ার_ ব্রিক: হ্যাঁ, আমি যে মন্তব্যে জবাব দিচ্ছি তাতে আমি উল্লেখ করেছি।
রুখ

123

আপনি যদি এটি ডিবাগিংয়ের জন্য একটি বৃহত স্ক্রিপ্টের অংশটি এড়াতে ব্যবহার করছেন (কার্ল নিকোলের মন্তব্য দেখুন), তবে মিথ্যা যদি ভাল বিকল্প হতে পারে ("মিথ্যা" সর্বদা উপলব্ধ থাকে কিনা তা নিশ্চিত নয়, আমার জন্য এটি / বিন / মিথ্যাতে রয়েছে) :

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

if false; then

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

fi

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

আপনার ডিবাগিং কোডটি ছিঁড়ে ফেলার সময় হয় যখন অসুবিধা হয়। "যদি মিথ্যা" কনস্ট্রাক্টটি বেশ সহজবোধ্য এবং স্মরণীয় তবে আপনি কীভাবে ম্যাচিং ফাই পাবেন? যদি আপনার সম্পাদক আপনাকে ইনডেন্ট ব্লক করার অনুমতি দেয় তবে আপনি এড়িয়ে যাওয়া ব্লকটি ইনডেন্ট করতে পারেন (তারপরে আপনি এটি শেষ করার পরে এটি পুনরায় রাখতে চান)। অথবা ফাই লাইনে একটি মন্তব্য, তবে এটি এমন কিছু হতে হবে যা আপনি মনে রাখবেন, যা আমার সন্দেহ হয় খুব প্রোগ্রামার নির্ভর।


6
হ্যাঁ falseসর্বদা উপলব্ধ। তবে আপনার যদি কোডের একটি ব্লক থাকে তবে আপনি কার্যকর করতে চান না, কেবল এটির মন্তব্য করুন। অথবা এটি মুছুন (এবং পরে যদি আপনার এটি পুনরুদ্ধার করতে হয় তবে আপনার উত্স নিয়ন্ত্রণ সিস্টেমটি দেখুন)।
কিথ থম্পসন

1
যদি কোডের ব্লকটি একসাথে এক লাইনে দীর্ঘক্ষণ মন্তব্য করার জন্য দীর্ঘ হয় তবে এই কৌশলগুলি দেখুন। stackoverflow.com/questions/947897/… তবে, এগুলি কোনও পাঠ্য সম্পাদককে শুরু থেকে শেষের সাথে মেলে না, তাই তারা কোনও উন্নতি করতে পারে না।
ক্যামিল গৌডেসুন

4
"যদি মিথ্যা" কোড মন্তব্য করার চেয়ে প্রায়শই ভাল, কারণ এটি নিশ্চিত করে যে বদ্ধ কোডটি আইনি কোড হিসাবে অবিরত থাকবে। কোড মন্তব্য করার জন্য সর্বোত্তম অজুহাতটি হ'ল সত্যই মুছতে হবে তবে এটির কিছু মনে রাখা দরকার - সুতরাং এটি কেবল একটি মন্তব্য, এবং আর "কোড" থাকবে না।
জেফ লারম্যান

1
আমি '#F মিথ্যা;' মন্তব্যটি ব্যবহার করি। এইভাবে আমি এটির জন্য অনুসন্ধান করতে এবং ডিবাগ অপসারণ বিভাগের শুরু এবং শেষ উভয়ই খুঁজে পেতে পারি।
জন

এই উত্তরটি আপত্তিযুক্ত হওয়া উচিত নয় কারণ এটি কোনওভাবেই ওপির প্রশ্নের জবাব দেয় না।
ভিক্টর জোড়াস

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 "/ # $ লেবেল: / {: a; n; p; ba};" $ 0 | গ্রেপ-ভি ': $') এর সাথে শুরু হওয়া লেবেলগুলি: # শুরু করুন: => এটি স্ক্রিপ্ট ত্রুটিগুলি রোধ করবে
19_17

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
আমি মনে করি এটি উত্তর হওয়া উচিত। প্রদত্ত নির্দেশ থেকে আমার কোনও স্ক্রিপ্টের পুনঃসূচনা বাস্তবায়ন সমর্থন করার জন্য সত্যিকারের প্রয়োজনের প্রয়োজন। এটি প্রতিটি উপায়ে তবে শব্দার্থক, গোটো এবং শব্দার্থবিজ্ঞান এবং সিনট্যাকটিক সুগারগুলি সুন্দর, তবে কঠোরভাবে প্রয়োজনীয় নয়। দুর্দান্ত সমাধান, আইএমও।
নাথান জি

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বক্তব্য।


গোটোর ভাল / খারাপ-নেসে না gettingুকেই লরেন্সের সমাধানটি দুর্দান্ত। আপনি আমার ভোট পেয়েছেন।
Mogens ট্র্যাশারডিকে

1
এটি এড়িয়ে যাওয়ার মতো, একটি if(false)মনে হয় (আমার কাছে) আরও বোধগম্য।
ভেস্পের্টো

2
বরাত দিয়ে এতে যান "LABEL" এর মানে হল যে এখানে-ডক করা হয় না প্রসারিত / মূল্যায়ন যা আপনি কিছু হার্ড থেকে রক্ষা করেন বাগ (এটি unquoted, এটা করা হতে পারে: প্যারামিটার সম্প্রসারণ, কমান্ড প্রতিকল্পন, এবং গাণিতিক সম্প্রসারণ, যা সব থাকতে পারে ক্ষতিকর দিক). আপনি এটির সাথে সামান্য টুইটও করতে এবং পুরোপুরি alias goto=":<<"বিতরণ করতে পারেন cat
মিঃ স্পুর্যাটিক

হ্যাঁ, ভেস্পের্তো, আপনি একটি 'যদি' বিবৃতি ব্যবহার করতে পারেন, এবং আমি এটি অনেক স্ক্রিপ্টে করেছি, তবে এটি খুব অগোছালো হয়ে যায় এবং এটি নিয়ন্ত্রণ করা এবং ট্র্যাক রাখা খুব কঠিন, বিশেষত যদি আপনি ঘন ঘন আপনার জাম্প পয়েন্টগুলি পরিবর্তন করতে চান।
লরেন্স রেনশওয়া 7'19

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

এই সমাধানে নিম্নলিখিত সমস্যাগুলি ছিল:

  • নির্বিচারে একটিতে শেষ হওয়া সমস্ত কোড লাইন সরিয়ে দেয় :
  • Treates 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। বিটিডাব্লু: যুক্তিটি goto trapকোনও goto ignoredকারণ হতে পারে, কারণ এটিই প্রস্থানটি gotoসৃষ্টি করে এবং 2>/dev/nullআপনার স্ক্রিপ্টটি বেরিয়ে আসছে বলে ত্রুটি বার্তাটি আড়াল করে।
জেসি চিশলম

2

এটি হুবিবিটাসের দ্বারা নির্মিত জুডি শ্মিড স্ক্রিপ্টের একটি ছোট সংশোধন।

স্ক্রিপ্টে অ-পালিত লেবেল স্থাপন করা মেশিনে সমস্যাযুক্ত ছিল এবং এটি ক্রাশের কারণ হয়েছিল। লেবেলগুলি এড়ানোর জন্য # যুক্ত করে সমাধান করার পক্ষে এটি যথেষ্ট সহজ ছিল। আলেকজ মাগুরাকে ধন্যবাদ এবং তাদের পরামর্শের জন্য অ্যাক্সেস_গ্রান্টড।

#!/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; বা};" উল্লেখ করছেন অংশ, আমি খুব সচেতন যে এটি ভিন্ন। আমি এটিকে নতুন লেবেল ফর্ম্যাটের জন্য পরিবর্তন করেছি (ওরফে # লেবেল # বনাম: অন্য উত্তরে লেবেল যা কিছু ক্ষেত্রে স্ক্রিপ্ট ক্র্যাশ করছে)। আমার উত্তর (যেমন স্ক্রিপ্ট ক্র্যাশ বা খারাপ সিনট্যাক্স) নিয়ে আপনার কিছু বৈধ সমস্যা আছে বা আপনি কেবল আমার উত্তরটি -1 করেছিলেন কারণ আপনি ভেবেছিলেন "আমি কীভাবে কাটা এবং পেস্ট করতে জানি না"?
thebunnyrules

1
@thebunnyrules আমি আপনার মত একই ইস্যুতে দৌড়েছি তবে আপনার সমাধানের জন্য এটি +1
ফব্বি

2

ডিবাগ করার সময় কোড ব্লক কমেন্ট করার জন্য একটি সহজ অনুসন্ধানযোগ্য গোটো।

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

ফলাফলটি হল -> GOTO সম্পন্ন হয়েছে


1

আমি ফাংশনগুলি ব্যবহার করে এটি করার একটি উপায় খুঁজে পেয়েছি।

বলুন, উদাহরণস্বরূপ, যদি আপনি 3 বিকল্প উপস্থিত রয়েছে: A, B, এবং CAএবং Bএকটি কমান্ড কার্যকর করে, তবে Cআপনাকে আরও তথ্য দেয় এবং আপনাকে আবার মূল প্রম্পটে নিয়ে যায়। এটি ফাংশন ব্যবহার করে করা যেতে পারে।

নোট করুন যেহেতু লাইন containg 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.