Я пытаюсь создать словарь во время выполнения и обновить значения, когда будет найден тот же ключ. По какой-то причине не удалось добавить список или обновить значения для ключа.
Код
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 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
Если вам нужен связанный массив и упорядоченные ключи, у вас есть два варианта:
Это все покрывает!
Для начала
declare -A name
создать ассоциативный массив.