Obtener el valor del argumento pasado al script al importar variables de otro script

Obtener el valor del argumento pasado al script al importar variables de otro script

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.shque 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 applecomo argumento, quiero obtener el valor de la variable , applees 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 !varel valor de la varvariable, 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 $PATHvariable, lo que puede sorprenderle).

yo también hecambiado echoaprintf.

El cambio funcional es utilizar la variable de bucle $argy 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

información relacionada