Я пытаюсь экспортировать переменные из одного скрипта в основной скрипт и передать одну из импортированных переменных в качестве аргумента основному скрипту.
Вот скрипт, 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