Ich versuche, Variablen aus einem Skript in das Hauptskript zu exportieren und eine der importierten Variablen als Argument an das Hauptskript zu übergeben.
Hier ist das Skript, fruitcolour.sh
das nur Variablen enthält:
apple="Red"
mango="Yellow"
orange="Orange"
pear="Green"
Hier ist das Hauptskript GetFruitColour.sh
:
#!/bin/bash
source fruitcolour.sh
echo "The colour of " $@ " is " $@ "."
Um es apple
als Argument zu übergeben, möchte ich den Wert der Variablen erhalten , apple
d. h .Red
Wenn ich also laufe,./GetFruitColour.sh apple
Es muss eine Ausgabe geben::The colour of apple is Red.
Antwort1
Eine Möglichkeit, dies zu erreichen, ist die Indirektion – das Verweisen auf eine andere Variable vom Wert der ersten Variablen aus.
Demonstrieren:
apple="Red"
var="apple"
echo "${!var}"
Ergebnisse in:
Red
Denn die Bash nimmt zunächst !var
den Wert der var
Variable an, der dann über interpretiert ${apple}
und in umgewandelt wird Red
.
Als Ergebnis könnte Ihr GetFruitColour.sh-Skript wie folgt aussehen:
#!/bin/bash
source ./fruitcolour.sh
for arg in "$@"
do
printf 'The colour of %s is %s.\n' "$arg" "${!arg}"
done
Ich habe den Pfad zum Quellskript relativ statt einfach gemacht, um deutlicher zu machen, wo sich die Datei befindet (wenn der angegebene Dateiname keinen Schrägstrich enthält, suchen Shells in der $PATH
Variable danach, was Sie vielleicht überrascht).
ich habe auchgewechselt echo
zuprintf
.
Die funktionale Änderung besteht darin, die Schleifenvariable $arg
und ihre indirekte Erweiterung zu verwenden, um die gewünschten Werte zu erzeugen:
$ ./GetFruitColour.sh apple mango
The colour of apple is Red.
The colour of mango is Yellow.
Beachten Sie, dass hier keine Fehlerprüfung erfolgt:
$ ./GetFruitColour.sh foo
The colour of foo is .
Möglicherweise ist die Verwendung eines assoziativen Arrays für Sie einfacher:
declare -A fruits='([orange]="Orange" [apple]="Red" [mango]="Yellow" [pear]="Green" )'
for arg in "$@"
do
if [ "${fruits["$arg"]-unset}" = "unset" ]
then
echo "I do not know the color of $arg"
else
printf 'The colour of %s is %s.\n' "$arg" "${fruits["$arg"]}"
fi
done
Antwort2
Sie müssen einen indirekten Variablenverweis verwenden:
Wenn das erste Zeichen des Parameters ein Ausrufezeichen (!) ist und der Parameter kein Nameref ist, wird eine Ebene der Indirektion eingeführt. Bash verwendet den durch die Erweiterung des restlichen Parameters gebildeten Wert als neuen Parameter. Dieser wird dann erweitert und dieser Wert wird im Rest der Erweiterung verwendet, anstatt der Erweiterung des ursprünglichen Parameters. Dies wird als indirekte Erweiterung bezeichnet.
Fruchtfarbe.sh:
#!/bin/bash
source fruitcolor.sh
echo "The color of $1 is ${!1}"
$ ./getfruitcolor.sh apple
The color of apple is Red