Ich verwende den bash -c
Befehl und eine Funktion:
fun ()
{
echo "$0" ## it reads the parameter $i
}
for i in {1..5}
do
bash -c "fun" $i &
done
Meine Frage ist: Können wir der Funktion mehrere Parameter übergeben, indem wir verwenden bash -c
? Zum Beispiel:
fun ()
{
echo "$0" ## it reads the parameter $i
}
var="string" #variable
for i in {1..5}
do
bash -c "fun" $i $var &
done
Antwort1
Haben Sie den Code tatsächlich ausgeführt? Beide Snippets kehren zurück fun: command not found
und dies ist das Problem, das Sie zuerst beheben müssen.
fun
Sofern Sie es nicht geschafft haben , als Funktion zu exportieren oder es zu definierenanderswoauf eine Weise, die es dem Inneren ermöglicht, bash
den Befehl zu erkennen (ich werde nicht näher darauf eingehen). Diese Situation wäre ziemlich irreführend und daher im Kontext weiterer Probleme bedauerlich.
Beginnen wir mit einfachem Code, der wahrscheinlich das tut, was Sie wollten:
#!/bin/bash
fun ()
{
echo "$1"
}
for i in {1..5}
do
fun "$i" &
done
Wenn Sie Zahlen in der falschen Reihenfolge erhalten, liegt das an &
. Ich habe &
hier verwendet, weil es in Ihrem Originalcode enthalten war.
Ihre Definition der Funktion ist syntaktisch in Ordnung. Meine Definition verwendet $1
anstelle von $0
, wir kommen gleich dazu. Um eine Funktion zu verwenden, rufen Sie einfach ihren Namen auf, mit oder ohne Argumente. In unserem Fall:
fun
fun arg1
fun arg1 arg2
Innerhalb einer Funktion werden $1
, $2
, … zu den entsprechenden Argumenten erweitert. Sie verwenden $@
(oder $*
wenn Sie wissen, was Sie tun), um alle Argumente abzurufen. Sie verwenden, $#
um die Anzahl der Argumente abzurufen. Dies ist einer Situation sehr ähnlich, in der es fun
sich um ein Shell-Skript handelt.
$0
innerhalb einer Funktion ist $0
Teil der Haupt-Shell. Es hat nichts mit den an die Funktion übergebenen Argumenten zu tun.
Sie können die Funktion in einer Subshell ausführen:
( fun arg1 )
oder im Hintergrund (wodurch es implizit auch in einer Subshell ausgeführt wird):
fun arg1 &
Wenn fun
eine Funktion in der Haupt-Shell ist, dann wissen diese Unter-Shells auch, was zu tun ist, wenn der Befehl lautet fun
. Andererseits bash -c
hat eine Shell, die mit gestartet wird, keine Ahnung von fun
.
Nochmals: es sei denn, Sie haben es geschafft export
… oder …
In Ihrem Fall bash -c
ist das eher ein Hindernis. Ich sehe keinen Sinn darin, es zu benutzen. Es ist möglich, es zum Laufen zu bringen, aber es wäre umständlich. Trotzdem, Ihrexplizitdie Frage ist:
können wir der Funktion mithilfe von mehrere Parameter übergeben
bash -c
?
Das können wir. Umständliches Beispiel weiter unten. Beachten Sie, dass die Funktion etwas anders ist (aus pädagogischen Gründen). Ich habe es auch weggelassen, &
weil es die Ergebnisse nur verschleiert.
#!/bin/bash
fun ()
{
echo "$2"
}
export -f fun
var="string"
for i in {1..5}
do
bash -c 'fun "$2" "$1"' inner-bash "$i" "$var"
done
Das Exportieren einer Funktion von Bash nach Bash ist möglich und wir haben es gerade getan. Das Exportieren einer Funktion von Bash nach einer anderen Shell ist unmöglich, es sei denn, die Shell versucht, kompatibel zu sein und interpretiert einige Umgebungsvariablen absichtlich als Funktionen.
fun "$2" "$1"
steht in einfachen Anführungszeichen, wird also in der Haupt-Shell "$2"
nicht "$1"
erweitert (in einfachen Anführungszeichen,sie sindnichtin doppelten Anführungszeichen). Im Kontext des Inneren werden bash
diese $2
und $1
in doppelte Anführungszeichen gesetzt und zu den danach angegebenen Parametern erweitert inner-bash
(was hier ein beliebiger Name ist).
Sehen Sie, was mit einer Nummer passiert, die wie folgt gespeichert ist $i
:
- es steht
$i
im Kontext der Hauptshell; - dann steht es
$1
im Kontext der inneren Schale; - dann steht es
$2
im Kontext der Funktion in der inneren Shell.
Die Verwendung hier hat keinen Vorteil bash -c
, sondern ist nur umständlich. Komplizieren Sie Ihren Code nicht auf diese Weise.
Eine Sache noch:Variablen in Anführungszeichen.