#bash #associative-array
Вопрос:
Я должен заполнить свой ассоциативный массив на основе моего вызова API Get. Мой сценарий выглядит так, где «get_fileshares» — это определенная функция, которая возвращает список файлов с именем и идентификатором в качестве полей. Теперь я хочу заполнить свой ассоциированный массив на ходу таким образом,чтобы для этого JSON мой массив выглядел следующим образом: Мой массив должен быть:
name=07bff899-4440-4ba9-85f5-c3e47555dc0e
name2=07bff899-4440-4ba9-85f5-c3e47555dc02
JSON
"values": [
{
"name": "test",
"id": "07bff899-4440-4ba9-85f5-c3e47555dc0e"
}
{
"name2": "test",
"id": "07bff899-4440-4ba9-85f5-c3e47555dc02"
}
]
declare -A a
n=($(get_fileshares | jq --raw-output '.values[].name'))
aa=($(get_fileshares | jq --raw-output '.values[].id'))
for (( i=0; i<${#n[@]}; i )); do
#echo ${d}
a[("${n[i]}")] =("${aa[i]}")
done
ошибка: не удается назначить список элементу массива
Комментарии:
1. «невозможно назначить список члену массива» — массивы bash строго одномерны. Если вам нужны более сложные структуры данных, вам придется выбрать другой язык.
2. Но я не присваиваю список в качестве значений. Я присваиваю только один ключ одному значению. Но очевидно, что мой связанный массив содержит много пар K,V. Это выполнимо в bash?
3. Я планирую сделать это: a[n[I]]=a[aa[I]]
4.
But I am not assigning a list as value
— вы добавляете элементы массива в элементa[...] = ( ... )
массива — в bash нет 2d — массивов.
Ответ №1:
Вы добавляете =
новые элементы массива ( ..)
в элемент массива a[...]
. Вместо этого назначьте фактическое значение.
n=(name name2)
aa=(samplevalue samplevalue2)
declare -A a
for (( i=0; i<${#n[@]}; i )); do
a[${n[i]}]="${aa[i]}"
done
declare -p a
Предложите использовать более описательные имена переменных, чем «aa», «n» или «a»…
Проверьте свои сценарии с помощью https://shellcheck.net . Пересмотрите некоторое введение в bash.
Подумайте о том, чтобы написать лучший jq
лайк jq -r '.[] | to_entries | (.[] | select(.value == "test") | .key), (.[] | select(.value != "test") | .value)'
и не использовать arr=(..)
его для разделения элементов. Исследуйте, когда использовать цитирование в оболочке, исследуйте разделение слов и расширение имени файла.