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

时间:2013-01-17 00:05:06

标签: bash shell

我正在尝试使用Bash脚本创建键值对的字典。我正在尝试使用这个逻辑:

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

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

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

6 个答案:

答案 0 :(得分:118)

在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

将遍历所有键值并将其回显。

答案 1 :(得分:29)

如果你可以使用一个简单的分隔符,那就是一个非常简单的oneliner:

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之后,我们使用parameter substitution在逗号,之前和之后的部分提取部分。

答案 2 :(得分:3)

对于持久性键/值存储,您可以使用kv-bashhttps://github.com/damphat/kv-bash

上提供的键/值数据库的纯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)

答案 3 :(得分:2)

在bash中,我们使用

declare -A name_of_dictonary_variable

以便Bash理解这是一本字典。

例如您想要创建sounds字典,

declare -A sounds

sounds[dog]="Bark"

sounds[wolf]="Howl"

其中dogwolf"keys",而BarkHowl"values"

您可以使用:echo ${sounds[@]}echo ${sounds[*]}

访问所有值

您只能使用以下命令访问所有键:echo ${!sounds[@]}

如果您想要特定键的任何值,则可以使用:

${sounds[dog]}

这将为您提供密钥(Bark)的价值(Dog)。

答案 4 :(得分:1)

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)

答案 5 :(得分:0)

在不支持sh的较旧bash(或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