bash에서 함수를 종료하는 방법


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

반환 : 반환 [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
당신이 경우 참고 set -e스크립트와의 상단에 설정 return 10 이외 또는 기타 번호, 전체 스크립트가 종료됩니다.
Yevgeniy Brikman

1
@YevgeniyBrikman 함수의 오류가 예상치 못한 경우에만 참입니다. 예 ||를 들어 함수가 호출 되면 0이 아닌 코드를 반환하고 스크립트가 계속 실행되도록 할 수 있습니다.
Dan Passaro

1
@DanPassaro Yup, 확실히 가능한 해결책이 있지만 set -e, 과거에 놀랍게도 나를 잡았 기 때문에 0이 아닌 값을 가져와 반환 하는 데 추가주의가 필요하다는 점을 강조하고 싶었 습니다.
Yevgeniy Brikman

21

return연산자 사용 :

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

오류없이 외부 함수 에서 반환 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시겠습니까? 여기서 콜론이하는 일은 무엇입니까?
홍콩 시내

:내장에 "어떤 조합"입니다 bash는 연산자입니다. 표현식을 평가하지만 아무 작업도하지 않습니다. 변수가 정의되지 않은 경우 실패 할 변수 대체를 수행하는 데 사용하고 있습니다.
Elliot Cameron

감사. 입력 매개 변수를 확인하기 위해 식을 다른 식으로 바꿀 수 do-something-complex있습니까? <code> checkPara () {if [$ 1 -lt $ 2]; 그런 다음 echo $ 3; fi; } do-something-complex () {checkPara $ # 1 "사용자에게 함수 사용 방법을 경고하는 메시지가 있습니다." echo "yes"} </ code> do-something-complex함수에 매개 변수가 제공되지 않으면 사용자에게 메시지를 표시하고 즉시 반환합니다.
brook hong

예, checkParafail함수를 사용 하여 전체 함수 스택을 종료하는 것과 같은 작업을 수행 할 수 있습니다.
Elliot Cameron

작동하지 않는 것 같습니다. (PS : code블록은 stackoverflow에 대한 주석에서 작동하지 않습니다). 이후에 계속 실행 checkPara됩니다.
홍콩 시내
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.