Cara keluar dari fungsi di bash

101

Bagaimana Anda keluar dari suatu fungsi jika kondisi benar tanpa mematikan seluruh skrip, cukup kembali ke sebelum Anda memanggil fungsi.

Contoh

# 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
}
Atomiklan
sumber

Jawaban:

139

Menggunakan:

return [n]

Dari help return

kembali : kembali [n]

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.
mohit
sumber
20
Perhatikan bahwa jika Anda telah set -emenyetel di bagian atas skrip dan Anda return 1atau nomor lain selain 0, seluruh skrip Anda akan keluar.
Yevgeniy Brikman
1
@YevgeniyBrikman itu hanya benar jika kesalahan dalam fungsi tidak terduga. Jika fungsi dipanggil menggunakan mis, ||maka dimungkinkan untuk mengembalikan kode bukan nol dan skrip tetap dijalankan.
Dan Passaro
1
@DanPassaro Yup, pasti ada solusi yang mungkin, tetapi saya hanya ingin mengatakan bahwa perhatian ekstra perlu diberikan set -edan mengembalikan nilai bukan nol, karena hal itu mengejutkan saya di masa lalu.
Yevgeniy Brikman
21

Gunakan returnoperator:

function FUNCT {
  if [ blah is false ]; then
    return 1 # or return 0, or even you can omit the argument.
  else
    keep running the function
  fi
}
Nemanja Boric
sumber
2

Jika Anda ingin kembali dari fungsi luar dengan kesalahan tanpa exiting, Anda dapat menggunakan trik ini:

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
}

Mencoba itu:

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

Ini memiliki manfaat tambahan / kelemahan yang anda dapat mematikan fitur ini: __fail_fast=x do-something-complex.

Perhatikan bahwa ini menyebabkan fungsi terluar mengembalikan 1.

Elliot Cameron
sumber
Bisakah Anda menjelaskan lebih lanjut tentang fungsi bagian dalam fail, apa yang dilakukan titik dua di sini?
brook hong
Ini :adalah operator bash built-in yang merupakan "no-op". Ini mengevaluasi ekspresi tetapi tidak melakukan apa pun dengannya. Saya menggunakannya untuk melakukan substitusi variabel yang akan gagal jika variabel tidak ditentukan, yang jelas tidak.
Elliot Cameron
Terima kasih. Bisakah saya mengganti ekspresi ke ekspresi lain untuk memeriksa parameter input do-something-complex? <code> checkPara () {if [$ 1 -lt $ 2]; lalu echo $ 3; fi; } do-something-complex () {checkPara $ # 1 "Beberapa pesan di sini untuk memperingatkan pengguna bagaimana menggunakan fungsi tersebut." echo "yes"} </code> Saya akan do-something-complexmenampilkan beberapa pesan kepada pengguna dan segera mengembalikan jika tidak ada parameter yang diumpankan ke fungsi tersebut.
brook hong
Ya, Anda bisa melakukan sesuatu seperti itu di mana checkParaakan menggunakan failfungsi saya untuk keluar dari seluruh tumpukan fungsi.
Elliot Cameron
Sepertinya tidak berhasil. (PS: codeblok tidak berfungsi di komentar di stackoverflow). Itu terus berjalan setelahnya checkPara.
brook hong