Bash'de bir işlevden nasıl çıkılır


101

Eğer bir koşul tüm komut dosyasını öldürmeden doğruysa, bir fonksiyondan nasıl çıkarsınız, sadece fonksiyonu çağırmadan önce geri dönün.

Misal

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

Yanıtlar:


139

Kullanım:

return [n]

Nereden help return

dönüş : dönüş [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 -eKomut dosyanızın üst kısmına sizin return 1veya 0 dışında herhangi bir sayı girerseniz , komut dosyanızın tamamının çıkacağını unutmayın.
— Yevgeniy Brikman

1
@YevgeniyBrikman bu yalnızca işlevdeki hata beklenmedikse doğrudur. İşlev örneğin kullanılarak çağrılırsa ||, sıfır olmayan bir kod döndürmek ve yine de betiğin çalışmaya devam etmesini sağlamak mümkündür.
— Dan Passaro

1
@DanPassaro Yup, kesinlikle mümkün olan çözümler var, ancak set -egeçmişte beni şaşırttığı için sıfır olmayan değerlere ekstra özen gösterilmesi ve geri döndürülmesi gerektiğini söylemek istedim .
— Yevgeniy Brikman

21

returnOperatörü kullan :

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

Eğer bir dış fonksiyondan hata ile dönmek exitistiyorsanız, bu numarayı kullanabilirsiniz:

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
}

Denemek:

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

Bu isteğe Bu özelliği kapatmak anlamına yararı / dezavantajı var: __fail_fast=x do-something-complex.

Bunun en dıştaki işlevin 1 döndürmesine neden olduğuna dikkat edin.


İç işlev hakkında daha fazla açıklayabilir misiniz fail, kolonun burada ne işi var?
— brook hong

:Yerleşik bir "hayır-op" dir bash operatörü olduğunu. İfadeyi değerlendirir ama onunla hiçbir şey yapmaz. Değişken tanımlanmamışsa başarısız olacak değişken ikamesi yapmak için kullanıyorum, ki bu açıkça değildir.
— Elliot Cameron

Teşekkürler. İfadeyi giriş parametresini kontrol etmek için başka bir ifadeyle değiştirebilir miyim do-something-complex? <code> checkPara () {if [$ 1 -lt $ 2]; sonra 3 $ echo; fi; } karmaşık bir şey yap () {checkPara $ # 1 "Kullanıcıyı işlevin nasıl kullanılacağı konusunda uyarmak için burada bir mesaj var." echo "yes"} </code> do-something-complexKullanıcıya bir mesaj gösteririm ve işleve beslenen bir parametre yoksa hemen geri dönerim.
— brook hong

Evet, bunun gibi bir şey yapabilirsiniz, burada checkParabenim failişlevimi tüm işlev yığınından çıkmak için kullanabilirsiniz .
— Elliot Cameron

Çalışmıyor gibi görünüyor. (Not: codeblok, stackoverflow'daki yorumda çalışmaz). Peşinden koşmaya devam ediyor checkPara.
— brook hong
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.