Cách thoát một hàm trong bash


97

Bạn sẽ thoát khỏi một hàm như thế nào nếu một điều kiện là đúng mà không giết toàn bộ tập lệnh, chỉ cần quay lại trước khi bạn gọi hàm.

Thí dụ

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

Câu trả lời:


136

Sử dụng:

return [n]

Từ help return

return : trở lại [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.

19
Lưu ý rằng nếu bạn đã set -eđặt ở đầu tập lệnh và của bạn return 1hoặc bất kỳ số nào khác ngoài 0, toàn bộ tập lệnh của bạn sẽ thoát.
Yevgeniy Brikman

1
@YevgeniyBrikman chỉ đúng nếu lỗi trong hàm không mong muốn. Nếu hàm được gọi bằng cách sử dụng ví dụ: ||thì có thể trả về mã khác không và vẫn có tập lệnh tiếp tục thực thi.
Dan Passaro

1
@DanPassaro Yup, chắc chắn là có các giải pháp khả thi, nhưng tôi chỉ muốn nói rằng cần phải cẩn thận hơn với set -evà trả về các giá trị khác 0, vì điều đó đã làm tôi ngạc nhiên trước đây.
Yevgeniy Brikman

20

Sử dụng returntoán tử:

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

Nếu bạn muốn trả về từ một hàm bên ngoài với lỗi mà không nhập, exitbạn có thể sử dụng thủ thuật này:

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
}

Đang dùng thử:

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

Điều này có thêm lợi ích / nhược điểm mà bạn có thể tùy chọn tắt tính năng này: __fail_fast=x do-something-complex.

Lưu ý rằng điều này khiến hàm ngoài cùng trả về 1.


Bạn có thể giải thích rõ hơn về chức năng bên trong fail, dấu hai chấm ở đây có tác dụng gì?
brook hong

Đây :là một toán tử bash được tích hợp sẵn là "no-op". Nó đánh giá biểu thức nhưng không làm bất cứ điều gì với nó. Tôi đang sử dụng nó để thực hiện thay thế biến sẽ không thành công nếu biến không được xác định, điều này rõ ràng là không.
Elliot Cameron

Cảm ơn. Tôi có thể thay thế biểu thức thành một số biểu thức khác để kiểm tra tham số đầu vào của do-something-complex? <code> checkPara () {if [$ 1 -lt $ 2]; sau đó echo $ 3; fi; } do-something-complex () {checkPara $ # 1 "Một số thông báo ở đây để cảnh báo người dùng cách sử dụng hàm." echo "yes"} </code> Tôi sẽ do-something-complexhiển thị cho người dùng một số thông báo và trả về ngay lập tức nếu không có tham số nào được cung cấp cho hàm.
brook hong,

Có, bạn có thể làm điều gì đó giống như vậy, nơi checkParasẽ sử dụng failhàm của tôi để thoát toàn bộ chồng hàm.
Elliot Cameron

Nó dường như không hoạt động. (PS: codekhối không hoạt động trong nhận xét trên stackoverflow). Nó tiếp tục chạy theo checkPara.
brook hong
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.