Holen Sie sich den Wert des an das Skript übergebenen Arguments, das Variablen aus einem anderen Skript importiert

Holen Sie sich den Wert des an das Skript übergebenen Arguments, das Variablen aus einem anderen Skript importiert

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.shdas 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 appleals Argument zu übergeben, möchte ich den Wert der Variablen erhalten , appled. 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 !varden Wert der varVariable 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 $PATHVariable danach, was Sie vielleicht überrascht).

ich habe auchgewechselt echozuprintf.

Die funktionale Änderung besteht darin, die Schleifenvariable $argund 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

verwandte Informationen