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.