2013-05-01 29 views
6

Momentan versuche ich einen Bash-Funktionsaufruf in einen anderen Funktionsaufruf zu verschachteln (so dass der Ausgang einer Funktion als Eingang für eine andere Funktion verwendet wird). Ist es möglich, Funktionsaufrufe in bash zu verschachteln, wie ich hier versuche?Verschachtelte Funktionsaufrufe in Bash

Zuerst I definiert sind diese beiden Funktionen:

returnSomething() 
{ 
    return 5; 
} 

funky() 
{ 
    echo $1; 
} 

Dann habe ich versucht, die Ausgabe einer Funktion als Eingang für die andere Funktion zu verwenden. Diese nächste Anweisung druckt jedoch nicht die Ausgabe returnSomething. Stattdessen druckt es überhaupt nichts.

funky $returnSomething; #Now I'm trying to use the output of returnSomething as the input for funky. 
+0

Versuchen Sie einfach 'funky returnSomething'. '$ returnSomething' ist eine Variable, kein Aufruf der Funktion. – fedorqui

+1

[siehe dies] (http://www.linuxjournal.com/content/return-values-bash-functions) – Wrikken

+1

'funky $ (returnSomething)' – Kevin

Antwort

9

Sie haben zwei Probleme. Einer davon ist, dass return den Ausgang einer Funktion nicht setzt, sondern seinen Exit-Status (Null für Erfolg, nicht Null für Fehler). Zum Beispiel wird Ausgabefoo (plus eine Newline), aber hat einen Exit-Status von 0. Zur Ausgabe steuern, verwenden echo oder printf:

function returnSomething()  # should actually be outputSomething 
{ 
    echo 5 
} 

Das andere Problem ist, dass $returnSomething (oder ${returnSomething}), um den Wert einer Variablen gibt returnSomething genannt:

x=5   # sets the variable x 
echo "$x" # outputs 5 

Um die Ausgabe eines Befehls zu erfassen, Verwenden Sie die Notation $(...) (oder `...`, aber letztere ist schwieriger). Also:

function funky() 
{ 
    echo "$("$1")" 
} 
funky returnSomething # prints 5 

oder gerade:

function funky() 
{ 
    "$1"   # runs argument as a command 
} 
funky returnSomething # prints 5 

dagegen, wenn Sie den Exit-Status eines Befehls erfassen wollen, verwenden Sie die spezielle Shell-Parameter ? (der mit dem Exit-Status gesetzt ist von ein Befehl, wenn es abgeschlossen ist):

function returnSomething() 
{ 
    return 5 
} 
function funky() 
{ 
    "$1"   # runs argument as a command 
    echo "$?"  # prints its exit status 
} 
funky returnSomething # prints 5 
+1

Ich habe immer noch nicht herausgefunden, wie man einen Funktionsaufruf (mit Parametern) in einen anderen Funktionsaufruf verschachtelt. Zum Beispiel erzeugt '(sampleFunction2 (sampleFunction1" Parameter für die Sample-Funktion 1 "))' einen Syntaxfehler nahe dem unerwarteten Token sampleFunction1''. Ist es möglich, geschachtelte Funktionsaufrufe wie diesen zu machen? –

+0

@AndersonGreen: Ich bin mir nicht sicher, dass ich verstehe, was Sie fragen; Bash-Befehle unterstützen eine größere Vielfalt möglicher Interaktionen als Funktionen in anderen Sprachen, daher gibt es mehrere Möglichkeiten, diese zu kombinieren, die alle als "Verschachtelung" bezeichnet werden könnten. Meine beste Vermutung ist, dass Sie vielleicht die * Ausgabe * des Befehls 'sampleFunction1- Parameter für die Beispielfunktion 1 '' erfassen möchten (statt wie üblich zur Konsole zu gehen), und Sie möchten, dass diese Ausgabe übergeben wird als * Argument * (ein Parameter) zur Funktion 'sampleFunction2'. Ist das richtig? Wenn ja, können Sie schreiben * (Fortsetzung) * – ruakh

+0

* (Fortsetzung) * 'sampleFunction2" $ (sampleFunction1 "Parameter für die Beispielfunktion 1") "'. – ruakh

0

Wie wäre es damit:

function foo() { echo one two three; } 
function bar() { echo foo #1: $1 } 
bar $(foo) # ==> foo #1: one 

Die oben hat Problem, dank Anderson für sie heraus zeigen. Hier ist ein Update:

function foo() { echo one two three; } 
function bar() { echo foo $1; } 
bar $(foo) 
+1

'prog.sh: Zeile 4: Syntaxfehler: unerwartetes Ende der Datei' –

2

Bash ersetzt $(command) mit dem Ausgang des command, so können Sie funky $(returnSomething) verwenden funky die Ausgabe von returnSomething passieren. Es sieht jedoch so aus, als würden Sie return in bash missverstehen; Der Rückgabewert ist eine Zahl, die angibt, ob der Aufruf erfolgreich war. Die Art und Weise den Rückgabestatus des letzten Prozesses in bash zu bekommen, ist $?:

returnSomething 
funky $? 
+0

Bedeutet dies, dass es für eine Funktion in Bash grundsätzlich unmöglich ist, irgendeine Art von nicht ganzzahligem Wert zurückzugeben? –

+0

Ja, Sie müssen es ausdrucken und die Ausgabe erfassen, oder eine Variable setzen (obwohl es eine Reihe von Fehler gibt) – Kevin

+0

Was sind das "Gotchas", speziell? –

Verwandte Themen