556 Stimmen

Rückgabewert in einer Bash-Funktion

Ich arbeite mit einem Bash-Skript und ich möchte eine Funktion ausführen, um einen Rückgabewert auszugeben:

function fun1(){
  return 34
}
function fun2(){
  local res=$(fun1)
  echo $res
}

Wenn ich fun2 ausführe, wird "34" nicht ausgegeben. Warum ist das so?

40voto

Austin Phillips Punkte 14352

Das return-Statement legt den Exit-Code der Funktion fest, ähnlich wie exit es für das gesamte Skript tut.

Der Exit-Code des letzten Befehls ist immer in der Variablen $? verfügbar.

function fun1(){
  return 34
}

function fun2(){
  local res=$(fun1)
  echo $? # <-- Gibt immer 0 aus, da der 'local'-Befehl durchgegeben wird.

  res=$(fun1)
  echo $?  #<-- Gibt 34 aus
}

18voto

Tom Hundt Punkte 1552

Als Ergänzung zu den ausgezeichneten Beiträgen anderer, hier ein Artikel, der diese Techniken zusammenfasst:

  • setzen einer globalen Variablen
  • setzen einer globalen Variablen, deren Namen du der Funktion übergeben hast
  • setzen des Rückgabewerts (und abholen mit $?)
  • 'echo' einiger Daten (und abholen mit MYVAR=$(myfunction) )

Rückgabewerte von Bash-Funktionen

11voto

doc Punkte 687

Ich mag es, folgendes zu tun, wenn ich in einem Skript laufe, in dem die Funktion definiert ist:

POINTER= # Wird für Funktionsrückgabewerte verwendet

my_function() {
    # Mach etwas
    POINTER="my_function_return"
}

my_other_function() {
    # Mach etwas
    POINTER="my_other_function_return"
}

my_function
RESULT="$POINTER"

my_other_function
RESULT="$POINTER"

Ich mag das, weil ich dann Echo-Anweisungen in meinen Funktionen einfügen kann, wenn ich will

my_function() {
    echo "-> my_function()"
    # Mach etwas
    POINTER="my_function_return"
    echo "<- my_function. $POINTER"
}

8voto

Ahmed Sayed Punkte 1209

Der einfachste Weg, den ich mir vorstellen kann, ist die Verwendung von echo im Methodenrumpf wie folgt

get_greeting() {
  echo "Hallo, $1!"
}

STRING_VAR=$(get_greeting "General Kenobi")
echo $STRING_VAR
# Ausgabe: Hallo, General Kenobi!

4voto

Noam Manos Punkte 12442

Statt var=$(func) mit der gesamten Funktionsausgabe aufzurufen, können Sie eine Funktion erstellen, die die Eingangsargumente mit eval modifiziert.

var1="gibt es"
var2="jemanden"

function modify_args() {
    echo "Erstes Argument modifizieren"
    eval $1="aus"

    echo "Zweites Argument modifizieren"
    eval $2="dort?"
}

modify_args var1 var2
# Druckt "Erstes Argument modifizieren" und "Zweites Argument modifizieren"
# Setzt var1 = aus
# Setzt var2 = dort?

Dies könnte nützlich sein, wenn Sie folgendes benötigen:

  1. Auf stdout/stderr innerhalb des Funktionsumfangs drucken (ohne es zurückzugeben)
  2. Mehrere Variablen zurückgeben (setzen).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X