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
}

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.

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
}

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.