ব্যাশে কোনও ফাংশন থেকে কীভাবে প্রস্থান করবেন


101

পুরো স্ক্রিপ্টটি না মেরে কোনও শর্ত সত্য হলে আপনি কীভাবে কোনও ফাংশন থেকে বেরিয়ে আসবেন, ফাংশনটি বলার আগে কেবল ফিরে আসুন।

উদাহরণ

# Start script
Do scripty stuff here
Ok now lets call FUNCT
FUNCT
Here is A to come back to

function FUNCT {
  if [ blah is false ]; then
    exit the function and go up to A
  else
    keep running the function
  fi
}

উত্তর:


139

ব্যবহার:

return [n]

থেকে help return

প্রত্যাবর্তন : প্রত্যাবর্তন [এন]

Return from a shell function.

Causes a function or sourced script to exit with the return value
specified by N.  If N is omitted, the return status is that of the
last command executed within the function or script.

Exit Status:
Returns N, or failure if the shell is not executing a function or script.

20
মনে রাখবেন যে আপনি যদি set -eআপনার স্ক্রিপ্টের শীর্ষে এবং return 10 বা আপনার বা অন্য কোনও সংখ্যা সেট করে রেখেছেন তবে আপনার সম্পূর্ণ স্ক্রিপ্টটি প্রস্থান করবে।
ইয়েজেগেনি ব্রিকম্যান

4
ফাইলে ত্রুটিটি অপ্রত্যাশিত থাকলে @ ইয়েভেগেনি ব্রিকম্যান এটিই সত্য। যদি ফাংশনটিকে উদাহরণস্বরূপ ব্যবহার করে ডাকা হয় ||তবে ননজারো কোডটি ফেরানো সম্ভব এবং এখনও স্ক্রিপ্টটি চালানো চালিয়ে যেতে হবে।
ড্যান পাসারো

4
@ ডানপ্যাসারো ইয়ুপ, অবশ্যই সমাধানগুলি সম্ভবত রয়েছে, তবে আমি কেবল এটিই বলতে চেয়েছিলাম যে অতিরিক্ত যত্ন নেওয়া উচিত set -eএবং শূন্য- অমূল্যগুলি ফিরিয়ে নেওয়া উচিত , কারণ এটি অতীতে আমাকে অবাক করে দিয়েছিল।
ইয়েভেগেনি ব্রিকম্যান 21


2

যদি আপনি কোন ত্রুটিযুক্ত কোনও বহিরাগত ফাংশন থেকে exitআইং ছাড়াই ফিরে আসতে চান তবে আপনি এই কৌশলটি ব্যবহার করতে পারেন:

do-something-complex() {
  # Using `return` here would only return from `fail`, not from `do-something-complex`.
  # Using `exit` would close the entire shell.
  # So we (ab)use a different feature. :)
  fail() { : "${__fail_fast:?$1}"; }

  nested-func() {
      try-this || fail "This didn't work"
      try-that || fail "That didn't work"
  }
  nested-func
}

এটি চেষ্টা করে দেখুন:

$ do-something-complex
try-this: command not found
bash: __fail_fast: This didn't work

এই অতিরিক্ত লাভ / অসুবিধা হল যে আপনি বিকল্প হিসেবে এটিকে বৈশিষ্ট্যটি বন্ধ করতে পারেন আছে: __fail_fast=x do-something-complex

নোট করুন যে এর ফলে বহিরাগততম ফাংশনটি 1 ফিরে আসে।


আপনি অভ্যন্তরীণ ফাংশন সম্পর্কে আরও ব্যাখ্যা করতে পারেন fail, কোলন এখানে কী করছে?
ব্রুক হং

:একটি বিল্ট-ইন ব্যাশ অপারেটর একটি "নো-অপ" হয় না। এটি এক্সপ্রেশনকে মূল্যায়ন করে তবে এর সাথে কিছুই করে না। আমি এটি পরিবর্তনশীল বিকল্প ব্যবহার করতে ব্যবহার করছি যা ভেরিয়েবল সংজ্ঞায়িত না হলে ব্যর্থ হবে যা স্পষ্টতই এটি নয়।
ইলিয়ট ক্যামেরন

ধন্যবাদ এর ইনপুট প্যারামিটারটি পরীক্ষা করতে আমি কি অভিব্যক্তিটি অন্য কোনও অভিব্যক্তির প্রতিস্থাপন করতে পারি do-something-complex? <কোড> চেকপাড়া () {যদি [$ 1 -ল্ট $ 2]; তারপরে প্রতিধ্বনি করুন $ 3; ফাই } do-કંઈક-জটিল () {চেকপাড়া $ # 1 "ব্যবহারকারীকে কীভাবে এই ফাংশনটি ব্যবহার করবেন সে সম্পর্কে সতর্ক করতে এখানে কিছু বার্তা রয়েছে" " প্রতিধ্বনি "হ্যাঁ"} </code> আমি do-something-complexব্যবহারকারীকে কিছু বার্তা দেখাব এবং যদি ফাংশনে কোনও প্যারামিটার খাওয়ানো না হয় তবে অবিলম্বে ফিরে আসব।
ব্রুক হং

হ্যাঁ আপনি এমন কিছু করতে পারেন যেখানে checkParaআমার failফাংশনটি পুরো ফাংশনের স্ট্যাক থেকে প্রস্থান করতে ব্যবহার করবে ।
এলিয়ট ক্যামেরন

মনে হচ্ছে এটি কাজ করছে না। (পিএস: codeব্লক স্ট্যাকওভারফ্লোতে মন্তব্যে কাজ করে না)। এটি পরে চলতে থাকে checkPara
ব্রুক হং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.