วิธีออกจากฟังก์ชันใน 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 1หรือหมายเลขอื่น ๆ นอกเหนือจาก 0 สคริปต์ทั้งหมดของคุณจะออก
Yevgeniy Brikman

1
@YevgeniyBrikman จะเป็นจริงก็ต่อเมื่อเกิดข้อผิดพลาดในฟังก์ชันที่ไม่คาดคิด หากฟังก์ชันถูกเรียกโดยใช้เช่น||ก็เป็นไปได้ที่จะส่งคืนรหัสที่ไม่ใช่ศูนย์และยังคงให้สคริปต์ดำเนินการต่อไป
Dan Passaro

1
@DanPassaro Yup มีวิธีแก้ปัญหาที่เป็นไปได้อย่างแน่นอน แต่ฉันแค่อยากจะบอกว่าต้องดูแลเป็นพิเศษset -eและคืนค่าที่ไม่ใช่ศูนย์เหมือนที่ทำให้ฉันประหลาดใจในอดีต
Yevgeniy Brikman


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ลำไส้ใหญ่ทำอะไรที่นี่?
brook hong

:เป็นตัวในการประกอบการทุบตีที่เป็น "ไม่มี-op" มันประเมินนิพจน์ แต่ไม่ได้ทำอะไรกับมัน ฉันกำลังใช้มันเพื่อทำการแทนที่ตัวแปรซึ่งจะล้มเหลวหากไม่ได้กำหนดตัวแปรซึ่งเห็นได้ชัดว่าไม่ใช่
Elliot Cameron

ขอบคุณ. ฉันสามารถแทนที่นิพจน์เป็นนิพจน์อื่นเพื่อตรวจสอบพารามิเตอร์อินพุตของdo-something-complex? <code> checkPara () {if [$ 1 -lt $ 2]; แล้วสะท้อน $ 3; fi; } do-something-complex () {checkPara $ # 1 "ข้อความบางส่วนที่นี่เพื่อเตือนผู้ใช้เกี่ยวกับการใช้ฟังก์ชันนี้" echo "yes"} </code> ฉันจะdo-something-complexแสดงข้อความบางอย่างให้กับผู้ใช้และส่งคืนทันทีหากไม่มีพารามิเตอร์ที่ป้อนให้กับฟังก์ชัน
brook hong

ใช่คุณสามารถทำบางอย่างได้โดยที่checkParaจะใช้failฟังก์ชันของฉันเพื่อออกจากฟังก์ชันสแต็ก
Elliot Cameron

ดูเหมือนจะไม่ทำงาน (PS: codeบล็อกไม่ทำงานในความคิดเห็นบน stackoverflow) checkParaมันทำให้การทำงานหลังจากที่
brook hong
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.