2016-06-29 4 views
0

Können Sie einen Befehl als Variable an eine andere Funktion übergeben? Wenn ja, wie lautet die Syntax?Einen Befehl als Variable an eine Funktion in Unix übergeben

Mein Code sieht ungefähr so ​​aus.

function1(){ 

for a in $1 
do 
    echo $a 
done 
} 

function2(){ 

function1 "ls -lrt folder/Name | grep 'foo' | grep 'bar'" 

} 

Aber das funktioniert nicht. Ich habe sogar versucht es vorbei wie:

function1 `ls -lrt folder/Name | grep 'foo' | grep 'bar'` 

Aber das geht nur der erste Wert des Befehls (und ich verstehe, warum dies geschieht).

Kennt jemand die Syntax, um einen Befehl als Variable zu übergeben?

+1

Wenn Sie 'für ein in $ 1' in' function1' sagen, bedeutet dies, dass Sie gerade den ersten Parameter durchgehen. Wenn Sie alle Parameter durchlaufen wollen, müssen Sie '$ @' verwenden. – fedorqui

+0

Der obige Kommentar ist korrekt, Sie könnten auch einfach die for-Schleife auslassen und einfach 'echo @ a' machen - wenn Sie nur diese eine Zeichenfolge/Funktion übergeben wollen – Vaelor

+0

habe ich es versucht, es funktioniert! Danke vielmals! :) – user2882388

Antwort

0

Wie in den Kommentaren angegeben, verwenden Sie $1, aber dies wird nur den ersten Parameter enthalten. Stattdessen müssen Sie [email protected] verwenden.

Von Bash Manual → 3.4.2 Special Parameters:

$ @

($ @) erweitert sich auf die Positionsparameter, ausgehend von einem. Wenn die Erweiterung in doppelten Anführungszeichen auftritt, wird jeder Parameter auf ein separates Wort erweitert. Das heißt, "$ @" entspricht "$ 1" "$ 2" .... Wenn die doppelt zitierte Erweiterung innerhalb eines Worts auftritt, wird die Erweiterung des ersten Parameters mit dem Anfangsteil des ursprünglichen Worts verbunden, und die Erweiterung des letzten Parameters wird mit dem letzten Teil des ursprünglichen Worts verknüpft. Wenn keine Positionsparameter vorhanden sind, expandieren "$ @" und $ @ zu nichts (d. H., Sie werden entfernt).

Dann fragen Sie

Was passiert, wenn die function1 mehrere Parameter nimmt? Und der Befehl ist der dritte Parameter wird übergeben, dann verwendet $ @ in einigen unnötige Werte. Wie nehme ich Werte ab $ 3?

Dazu wollen Sie shift verwenden:

$ cat myscript.sh 
#!/bin/bash 
shift 2 

echo "[email protected]" 
$ ./myscript.sh a b c d 
c d 

Verschiebung

shift [n] 

verschieben sich die Positionsparameter nach links von n. Die positionellen Parameter von n + 1 ... $ # werden in $ 1 ... $ # - n umbenannt. Die Parameter , dargestellt durch die Zahlen $ # bis $ # - n + 1, sind nicht gesetzt. n muss eine nicht negative Zahl kleiner oder gleich $ # sein. Wenn n 0 oder größer als 0 ist, werden die Positionsparameter nicht geändert. Wenn n nicht ist, wird es als 1 angenommen. Der Rückgabestatus ist Null, es sei denn, n ist größer als $ # oder kleiner als Null, andernfalls ungleich Null.