Нужно загрузить локальные переменные в ассоциативный массив в Bash - PullRequest
0 голосов
/ 20 мая 2018

Я создаю сценарий инициализации, который заполняет переменные, откуда они централизованно определены в файле bash, в различные не-bash файлы (sql, nginx и т. Д.) Как часть ускорения виртуальной машины.

Мне нужно создать ассоциативный массив, заполненный моими локальными переменными.

Например:

#!/usr/bin/env bash
var1=abc
var2=123
var3=xyz
declare -A vars_list

#magic script would produce this:
vars_list=([var1]=$var1 [var2]=$var2 [var3]=$var3)

#print out
for i in "${!vars_list[@]}"
do
  echo "key  : $i"
  echo "value: ${vars_list[$i]}"
done

даст:

ключ: var1
значение: abc
ключ: var3
значение: xyz
ключ: var2
значение: 123

Слишком долго пытался.Похоже, это еще одна вещь, которую Bash просто не может сделать просто.Помощь

Ответы [ 3 ]

0 голосов
/ 21 мая 2018

Чем

var1=abc
var2=123
var3=xyz

лучше, чем

declare -A vars_list
vars_list=(
    [var1]=abc
    [var2]=123
    [var3]=xyz
)

?Просто назначьте ассоциативный массив напрямую.

0 голосов
/ 21 мая 2018
declare -A vars
while IFS= read -r var; do
  vars[$var]=${!var}
done < <(compgen -v)

compgen -v перечисляет переменные, определенные в настоящее время (только имена, без значений, избегая трудностей анализа, присутствующих с set и неконтролируемыми значениями).

0 голосов
/ 20 мая 2018

Вы можете попробовать этот способ.

var1=abc
var2=123
var3=xyz
declare -A vars_list

#magic script would produce this:
vars_index=('var1' 'var2' 'var3')
for ((i=0;i<${#vars_index[@]};i++))
do
    vars_list["${vars_index[i]}"]="${!vars_index[i]}"
done

#print out
for i in "${!vars_list[@]}"
do
    echo "key  : $i"
    echo "value : ${vars_list[$i]}"
done
...