Я пытаюсь создать словарь пары ключ-значение с помощью сценария Bash. Я пытаюсь использовать эту логику:
declare -d dictionary
defaults write "$dictionary" key -string "$value"
... где $dictionary
переменная, но это не работает.
Есть ли способ создавать пары ключ-значение в сценарии Bash?
Ответы:
В bash версии 4 были введены ассоциативные массивы.
declare -A arr arr["key1"]=val1 arr+=( ["key2"]=val2 ["key3"]=val3 )
Теперь массив arr содержит три пары значений ключа. Bash довольно ограничен в том, что вы можете с ними делать, без сортировки, извлечения и т. Д.
for key in ${!arr[@]}; do echo ${key} ${arr[${key}]} done
Будет перебирать все ключевые значения и выводить их эхом.
Примечание. Bash 4 не входит в состав Mac OS X из-за лицензии GPLv3; вам нужно скачать и установить его. Подробнее об этом см. Здесь
источник
Если вы можете использовать простой разделитель, очень простой одинарный разделитель будет следующим:
for i in a,b c_s,d ; do KEY=${i%,*}; VAL=${i#*,}; echo $KEY" XX "$VAL; done
При этом
i
заполняется последовательностями символов, такими как"a,b"
и"c_s,d"
. каждый разделен пробелами. Послеdo
мы используем подстановку параметров, чтобы извлечь часть перед запятой,
и часть после нее.источник
b
переменная содержит пробелы?Для постоянного хранения ключей / значений вы можете использовать
kv-bash
чистую реализацию bash базы данных ключ / значение, доступную по адресу https://github.com/damphat/kv-bashПрименение
git clone https://github.com/damphat/kv-bash source kv-bash/kv-bash
Попробуйте создать несколько постоянных переменных
kvset myName xyz kvset myEmail xyz@example.com #read the varible kvget myEmail #you can also use in another script with $(kvget keyname) echo $(kvget myEmail)
источник
В bash мы используем
declare -A name_of_dictonary_variable
чтобы Баш понял, что это словарь.
Например, вы хотите создать
sounds
словарь,declare -A sounds sounds[dog]="Bark" sounds[wolf]="Howl"
где
dog
иwolf
есть"keys"
, иBark
иHowl
есть"values"
.Вы можете получить доступ ко всем значениям, используя:
echo ${sounds[@]}
ИЛИecho ${sounds[*]}
Вы можете получить доступ ко всем ключам, только используя:
echo ${!sounds[@]}
И если вам нужно какое-либо значение для определенного ключа, вы можете использовать:
${sounds[dog]}
это даст вам value (
Bark
) для key (Dog
).источник
в более старом bash (или в
sh
), который не поддерживаетdeclare -A
, можно использовать следующий стиль для имитации ключа / значения# key env=staging # values image_dev=gcr.io/abc/dev image_staging=gcr.io/abc/stage image_production=gcr.io/abc/stable img_var_name=image_$env # active_image=${!var_name} active_image=$(eval "echo \$$img_var_name") echo $active_image
источник