Получить значение переданного аргумента скрипту, импортируя переменные из другого скрипта

Получить значение переданного аргумента скрипту, импортируя переменные из другого скрипта

Я пытаюсь экспортировать переменные из одного скрипта в основной скрипт и передать одну из импортированных переменных в качестве аргумента основному скрипту.

Вот скрипт, fruitcolour.shсодержащий только переменные:

apple="Red"
mango="Yellow"
orange="Orange"
pear="Green"

Вот основной сценарий GetFruitColour.sh:

#!/bin/bash

source fruitcolour.sh

echo "The colour of " $@ " is " $@ "."

Для передачи appleв качестве аргумента я хочу получить значение переменной , appleт.е.Red

Итак, когда я бегу./GetFruitColour.sh apple

Он должен выдать результат ::The colour of apple is Red.

решение1

Одним из способов достижения этого является косвенное обращение к другой переменной по значению первой переменной.

Демонстрировать:

apple="Red"
var="apple"
echo "${!var}"

Результаты в:

Red

Потому что bash сначала принимает !varза значение значение переменной var, которое затем интерпретируется через ${apple}и преобразуется в Red.

В результате ваш скрипт GetFruitColour.sh может выглядеть так:

#!/bin/bash

source ./fruitcolour.sh

for arg in "$@"
do
  printf 'The colour of %s is %s.\n' "$arg" "${!arg}"
done

Я сделал путь к исходному скрипту относительным, а не пустым, чтобы было понятнее, где находится файл (если указанное имя файла не содержит слеша, оболочки будут искать $PATHего в переменной, что может вас удивить).

Я такжеизменился echoнаprintf.

Функциональное изменение заключается в использовании переменной цикла $argи ее косвенного расширения для получения желаемых значений:

$ ./GetFruitColour.sh apple mango
The colour of apple is Red.
The colour of mango is Yellow.

Обратите внимание, что здесь нет проверки ошибок:

$ ./GetFruitColour.sh foo
The colour of foo is .

Возможно, вам будет проще использовать ассоциативный массив:

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

решение2

Вам необходимо использовать косвенную ссылку на переменную:

Если первый символ параметра — восклицательный знак (!), а параметр не является ссылкой на имя, он вводит уровень косвенности. Bash использует значение, сформированное путем расширения остатка параметра, как новый параметр; затем он расширяется, и это значение используется в остальной части расширения, а не в расширении исходного параметра. Это известно как косвенное расширение.

fruitcolor.sh:

#!/bin/bash

source fruitcolor.sh

echo "The color of $1 is ${!1}"

$ ./getfruitcolor.sh apple
The color of apple is Red

Связанный контент