Ассоциативный массив заполняется в цикле for

#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=(..) его для разделения элементов. Исследуйте, когда использовать цитирование в оболочке, исследуйте разделение слов и расширение имени файла.