Сценарий оболочки: невозможно обновить значения для ключа

Я пытаюсь создать словарь во время выполнения и обновить значения, когда будет найден тот же ключ. По какой-то причине не удалось добавить список или обновить значения для ключа.

Код

    declare -a list
    
     list+=(["key1"]="a")
     list+=(["key4"]="b")
     list+=(["key2"]="c")
     list+=(["key3"]="b")
    
    
     list=("${list["key1"]}" "new")
     list=("${list["key2"]}" "xyz")
     list=("${list["key3"]}" "mno")
     list=("${list["key4"]}" "klo")
      
for i in "${list[@]}"  
 do  
 echo The key value of element "${list[$i]}" is "$i"  
done 

echo ${arr["key1"]}

Выход

The key value of element b is b
The key value of element b is klo
b 

Он всегда печатает последний элемент, добавленный к списку. Вместо печати "a new"

Ожидаемый результат будет.

The key value of element key1 is a new
The key value of element key2 is b xyz
The key value of element key3 is c mno
The key value of element key4 is d klo

Для начала declare -A name создать ассоциативный массив.

Shawn 10.04.2022 07:06

Пробел перед += и = является синтаксической ошибкой.

Allan Wind 10.04.2022 07:08
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
2
26
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пробел перед += и = является синтаксической ошибкой. Пробелы важны для удобочитаемости. Вы пытаетесь использовать индексированный массив (declare -a list), на который ссылаются с помощью целых чисел, но вы используете его как связанный массив (declare -A list), который позволяет ссылаться на произвольные строки. Также ваши входные данные не соответствуют ожидаемому результату (например, в первом разделе нет d). Последняя строка относится к несуществующей переменной, поэтому она удалена.

declare -A list
    
list[key1]="a"
list[key2]="b"
list[key3]="c"
list[key4]="d"

list[key1]="${list[key1]} new"
list[key2]="${list[key2]} xyz"
list[key3]="${list[key3]} mno"
list[key4]="${list[key4]} klo"

for i in "${!list[@]}"  
do  
    echo The key value of element "$i" is "${list[$i]}"
done 

даст следующий вывод:

The key value of element key4 is d klo
The key value of element key2 is b xyz
The key value of element key3 is c mno
The key value of element key1 is a new

Если вам нужен связанный массив и упорядоченные ключи, у вас есть два варианта:

  1. сортируйте ключи, прежде чем перебирать их в цикле
  2. явно хранить порядок ключей в индексированном массиве, повторять над тем, чтобы найти ключи в порядке. Затем найдите значение по ключу в ассоциированный массив.

Это все покрывает!

David C. Rankin 10.04.2022 07:42

Другие вопросы по теме