Próbuję utworzyć słownik pary klucz-wartość za pomocą skryptu Bash. Próbuję użyć tej logiki:
declare -d dictionary
defaults write "$dictionary" key -string "$value"
... gdzie $dictionary
jest zmienna, ale to nie działa.
Czy istnieje sposób tworzenia par klucz-wartość w skrypcie Bash?
Odpowiedzi:
W bash w wersji 4 wprowadzono tablice asocjacyjne.
declare -A arr arr["key1"]=val1 arr+=( ["key2"]=val2 ["key3"]=val3 )
Tablica arr zawiera teraz trzy pary klucz-wartość. Bash jest jednak dość ograniczony, co możesz z nimi zrobić, bez sortowania lub poppingu itp.
for key in ${!arr[@]}; do echo ${key} ${arr[${key}]} done
Zapętli wszystkie kluczowe wartości i wyświetli je echo.
Uwaga: Bash 4 nie jest dostarczany z Mac OS X ze względu na licencję GPLv3; musisz go pobrać i zainstalować. Więcej na ten temat znajdziesz tutaj
źródło
Jeśli możesz użyć prostego separatora, bardzo prosty oneliner to:
for i in a,b c_s,d ; do KEY=${i%,*}; VAL=${i#*,}; echo $KEY" XX "$VAL; done
Niniejszym
i
jest wypełniony sekwencjami znaków, takimi jak"a,b"
i"c_s,d"
. każdy oddzielony spacjami. Podo
WYKORZYSTUJEMY parametru podstawienia wyodrębnić część przed przecinku,
, a część po nim.źródło
b
zmienna zawiera spacje?W celu trwałego przechowywania kluczy / wartości można użyć
kv-bash
czystej implementacji bazy danych kluczy / wartości dostępnej pod adresem https://github.com/damphat/kv-bashStosowanie
git clone https://github.com/damphat/kv-bash source kv-bash/kv-bash
Spróbuj utworzyć stałe zmienne
kvset myName xyz kvset myEmail [email protected] #read the varible kvget myEmail #you can also use in another script with $(kvget keyname) echo $(kvget myEmail)
źródło
W bashu używamy
declare -A name_of_dictonary_variable
aby Bash zrozumiał, że to słownik.
Na przykład chcesz
sounds
wtedy stworzyć słownik,declare -A sounds sounds[dog]="Bark" sounds[wolf]="Howl"
gdzie
dog
iwolf
są"keys"
iBark
iHowl
są"values"
.Możesz uzyskać dostęp do wszystkich wartości za pomocą:
echo ${sounds[@]}
LUBecho ${sounds[*]}
Możesz uzyskać dostęp do wszystkich kluczy tylko za pomocą:
echo ${!sounds[@]}
A jeśli chcesz mieć jakąkolwiek wartość dla określonego klucza, możesz użyć:
${sounds[dog]}
da ci to wartość (
Bark
) dla klucza (Dog
).źródło
w starszych bash (lub in
sh
), które nie obsługujądeclare -A
, następujący styl może być użyty do emulacji klucza / wartości# 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
źródło