Können Sie mit bash -c mehrere Parameter an eine Bash-Funktion übergeben?

Können Sie mit bash -c mehrere Parameter an eine Bash-Funktion übergeben?

Ich verwende den bash -cBefehl 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 foundund dies ist das Problem, das Sie zuerst beheben müssen.

funSofern Sie es nicht geschafft haben , als Funktion zu exportieren oder es zu definierenanderswoauf eine Weise, die es dem Inneren ermöglicht, bashden 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 $1anstelle 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 funsich um ein Shell-Skript handelt.

$0innerhalb einer Funktion ist $0Teil 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 funeine Funktion in der Haupt-Shell ist, dann wissen diese Unter-Shells auch, was zu tun ist, wenn der Befehl lautet fun. Andererseits bash -chat eine Shell, die mit gestartet wird, keine Ahnung von fun.

Nochmals: es sei denn, Sie haben es geschafft export… oder …

In Ihrem Fall bash -cist 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 bashdiese $2und $1in 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 $iim Kontext der Hauptshell;
  • dann steht es $1im Kontext der inneren Schale;
  • dann steht es $2im 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.

verwandte Informationen