Если у вас Bash достаточно недавно, используйте атрибут косвенной переменной -n
, например:
#!/usr/bin/env bash
source values.sh
read -r -p 'Enter Identifier : ' pk
declare -n \
value1="${pk}_value1" \
value2="${pk}_value2" \
value3="${pk}_value3"
Альтернативный метод с заполнением ассоциативного массива из файла values.sh
:
#!/usr/bin/env bash
declare -A values="($(
xargs -l1 \
bash -c \
'IFS="=" read -r k v <<<"$@"; printf "[%q]=%q\n" "$k" "$v"' _ \
<values.sh
))"
read -r -p 'Enter Identifier : ' pk
declare -- \
value1="${values[${pk}_value1]}" \
value2="${values[${pk}_value2]}" \
value3="${values[${pk}_value3]}"
Рабочая совокупность ассоциативного массива:
xargs -l1
преобразует строки входного потока stdio
(здесь: <values.sh
) в аргументы команды.
Команда, вызываемая xargs
, является bash -c
, ведь она выполняет встроенный скрипт, подробно описанный здесь:
# Read variables k and v from the arguments
# streamed as a here-string <<<"",
# using the = sign as the Internal Field Separator.
# Actually splitting key=value into k and v.
IFS="=" read -r k v <<<"$@"
# Format variables k and v into an Associative array
# entry declaration in the form [key]=value,
# with %q adding quotes or escaping if required.
printf "[%q]=%q\n" "$k" "$v"
Наконец, объявление и присваивание ассоциативного массива declare -A values="($(commands))"
получает записи, сгенерированные xarg
и встроенными сценарий оболочки commands
.