
Estoy intentando exportar variables de un script al script principal y pasando una de las variables importadas como argumento al script principal.
Aquí está el script fruitcolour.sh
que solo tiene variables:
apple="Red"
mango="Yellow"
orange="Orange"
pear="Green"
Aquí está el guión principal GetFruitColour.sh
:
#!/bin/bash
source fruitcolour.sh
echo "The colour of " $@ " is " $@ "."
Para pasar apple
como argumento, quiero obtener el valor de la variable , apple
es decir Red
.
Entonces, cuando corro./GetFruitColour.sh apple
Debe dar salida ::The colour of apple is Red.
Respuesta1
Una forma de lograr esto es mediante la dirección indirecta: hacer referencia a otra variable a partir del valor de la primera variable.
Demostrar:
apple="Red"
var="apple"
echo "${!var}"
Resultados en:
Red
Porque bash primero entiende !var
el valor de la var
variable, que luego se interpreta ${apple}
y se convierte en Red
.
Como resultado, su script GetFruitColour.sh podría verse así:
#!/bin/bash
source ./fruitcolour.sh
for arg in "$@"
do
printf 'The colour of %s is %s.\n' "$arg" "${!arg}"
done
He hecho que la ruta al script de origen sea relativa en lugar de simple, para que quede más claro dónde está el archivo (si el nombre de archivo dado no contiene una barra, los shells buscarán la $PATH
variable, lo que puede sorprenderle).
yo también hecambiado echo
aprintf
.
El cambio funcional es utilizar la variable de bucle $arg
y su expansión indirecta para producir los valores deseados:
$ ./GetFruitColour.sh apple mango
The colour of apple is Red.
The colour of mango is Yellow.
Tenga en cuenta que aquí no hay verificación de errores:
$ ./GetFruitColour.sh foo
The colour of foo is .
Puede que le resulte más fácil utilizar una matriz asociativa:
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
Respuesta2
Debe utilizar una referencia de variable indirecta:
Si el primer carácter del parámetro es un signo de exclamación (!) y el parámetro no es un nameref, introduce un nivel de direccionamiento indirecto. Bash usa el valor formado al expandir el resto del parámetro como nuevo parámetro; luego se expande y ese valor se usa en el resto de la expansión, en lugar de la expansión del parámetro original. Esto se conoce como expansión indirecta.
colorfruta.sh:
#!/bin/bash
source fruitcolor.sh
echo "The color of $1 is ${!1}"
$ ./getfruitcolor.sh apple
The color of apple is Red