有办法在 Bash 脚本中创建键-值对吗?

我正在尝试使用 Bash 脚本创建一个键值对字典:

declare -d dictionary
defaults write "$dictionary" key -string "$value"

... 其中 $dictionary是一个变量,但这是不工作的。

有办法在 Bash 脚本中创建键-值对吗?

169002 次浏览

In bash version 4 associative arrays were introduced.

declare -A arr


arr["key1"]=val1


arr+=( ["key2"]=val2 ["key3"]=val3 )

The arr array now contains the three key value pairs. Bash is fairly limited what you can do with them though, no sorting or popping etc.

for key in ${!arr[@]}; do
echo ${key} ${arr[${key}]}
done

Will loop over all key values and echo them out.

Note: Bash 4 does not come with Mac OS X because of its GPLv3 license; you have to download and install it. For more on that see here

If you can use a simple delimiter, a very simple oneliner is this:

for i in a,b c_s,d ; do
KEY=${i%,*};
VAL=${i#*,};
echo $KEY" XX "$VAL;
done

Hereby i is filled with character sequences like "a,b" and "c_s,d". each separated by spaces. After the do we use parameter substitution to extract the part before the comma , and the part after it.

For persistent key/value storage, you can use kv-bash, a pure bash implementation of key/value database available at https://github.com/damphat/kv-bash

Usage

git clone https://github.com/damphat/kv-bash
source kv-bash/kv-bash

Try create some permanent variables

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)

In bash, we use

declare -A name_of_dictonary_variable

so that Bash understands it is a dictionary.

For e.g. you want to create sounds dictionary then,

declare -A sounds


sounds[dog]="Bark"


sounds[wolf]="Howl"

where dog and wolf are "keys", and Bark and Howl are "values".

You can access all values using : echo ${sounds[@]} OR echo ${sounds[*]}

You can access all keys only using: echo ${!sounds[@]}

And if you want any value for a particular key, you can use:

${sounds[dog]}

this will give you value (Bark) for key (dog).

in older bash (or in sh) that does not support declare -A, following style can be used to emulate key/value

# 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
Using an example above this is what I did


#!/bin/sh
lookup_vht_index() {
for i in VHT20,0 VHT40,1 VHT80,2 VHT160,3 ; do
KEY=${i%,*};
VAL=${i#*,};
#  echo $KEY" XX "$VAL;
[ "$1" = "$KEY" ] && echo $VAL
done
}


lookup_vht_name() {
for i in 0,VHT20 1,VHT40 2,VHT80 3,VHT160 ; do
KEY=${i%,*};
VAL=${i#*,};
#  echo $KEY" XX "$VAL;
[ "$1" = "$KEY" ] && echo $VAL
done
}




echo "VHT20="$(lookup_vht_index "VHT20")
echo "2="$(lookup_vht_name 2)