Czy istnieje sposób tworzenia par klucz-wartość w skrypcie Bash?

82

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 $dictionaryjest zmienna, ale to nie działa.

Czy istnieje sposób tworzenia par klucz-wartość w skrypcie Bash?

RKS
źródło
pracowałem nad bashem. Sam wymyśliłem sposób, aby to zrobić.
RKS
użycie tego również pomaga: urls + = ('<dict> <key> key1 </key> <string>' $ value1 '</string> <key> key2 </key> <string>' $ value2 '</ string > <key> key3 </key> <string> '$ value3' </string> </dict> '
RKS
3
Świetny! Możesz (a nawet zachęcać) do odpowiadania na własne pytania w StackOverflow, w ten sposób pomożesz innym w podobnej sytuacji.
Johnsyweb
Zagłosuję za twoją odpowiedzią, jeśli dołączysz przykładowe użycie i wyniki. Powodzenia.
łowca

Odpowiedzi:

154

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

peteches
źródło
25
Należy zauważyć, że Bash 4 nie jest dostarczany z systemem Mac OS X ze względu na licencję GPLv3; musisz go pobrać i zainstalować. (Apple nadal wysyła Bash 3.2.)
Proszę odstawić
5
Jest tu wada: iteracja nie jest uporządkowana według kolejności reklamowej.
AlikElzin-kilaka
zdecydowanie potrzebuje bash w wersji 4. W przeciwnym razie deklaracja -A nie działa. Mac jest wyposażony w bash 3.2
Mamun,
2
Nie wynika to z licencji GPLv3, ale dlatego, że Apple nie chce używać oprogramowania na licencji GPLv3. Więc nie ma nic złego w licencji GPLv3, ale zakładam, że coś jest nie tak z Apple.
Tech Nomad
32

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 ijest wypełniony sekwencjami znaków, takimi jak "a,b"i "c_s,d". każdy oddzielony spacjami. Po doWYKORZYSTUJEMY parametru podstawienia wyodrębnić część przed przecinku ,, a część po nim.

matematyka
źródło
Czy możesz wyjaśnić podany przykład?
AlikElzin-kilaka
Pytanie: Czy zadziała, jeśli bzmienna zawiera spacje?
AlikElzin-kilaka
w moim przykładzie b nie jest zmienną i nie, nie zadziała, ponieważ lista pętli for jest oddzielona spacjami.
matematyka
2

W celu trwałego przechowywania kluczy / wartości można użyć kv-bashczystej implementacji bazy danych kluczy / wartości dostępnej pod adresem https://github.com/damphat/kv-bash

Stosowanie

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)
andrej
źródło
2

W bashu używamy

declare -A name_of_dictonary_variable

aby Bash zrozumiał, że to słownik.

Na przykład chcesz soundswtedy stworzyć słownik,

declare -A sounds

sounds[dog]="Bark"

sounds[wolf]="Howl"

gdzie dogi wolf"keys"i Barki Howl"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).

Ruchir Dixit
źródło
0

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
romanlv
źródło