Объявление переменных с косвенной ссылкой с префиксом - PullRequest
1 голос
/ 28 апреля 2020

Мои параметры хранятся в файле, и я вызываю их с префиксом, который я получаю, он имеет ввод. теперь я получаю входные данные, префиксирую их и сохраняю как новую переменную, а затем косвенно указываю мою новую переменную на мою фактическую переменную для использования в моем сценарии.

Есть ли способ напрямую упомянуть указатель на косвенную переменную в мою основную переменную вроде value1 = $ (! $ pk_value1) примерно так, чтобы я мог пропустить объявление новой переменной. у меня есть около 10 переменных для объявления, что делает мой код длинным.

Мой текущий код:

source values.sh
read -p "Enter Identifier : " pk

value1here=${pk}_value1
value2here=${pk}_value2
value3here=${pk}_value3

value1=${!value1here}
value2=${!value2here}
value3=${!value3here}

значения. sh (У меня здесь объявлено около 300 переменных)

p1_value1=name1
p1_value2=host1
p1_value3=user1

p2_value1=name2
p2_value2=host2
p2_value3=user2

Есть ли способ напрямую упомянуть указатель косвенной переменной + мое имя, например value1 = $ (! $ Pk_value1) что-то вот так, чтобы я мог пропустить объявление новой переменной. у меня есть около 10 переменных, которые должны быть объявлены, что делает мой код длинным.

1 Ответ

4 голосов
/ 28 апреля 2020

Если у вас 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...