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

问题描述 投票:0回答:7

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

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

...其中

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

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

bash shell associative-array
7个回答
212
投票

在 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 由于其 GPLv3 许可证而未随 Mac OS X 一起提供;你必须下载并安装它。有关更多信息,请参阅此处


45
投票

如果你可以使用简单的分隔符,一个非常简单的单行符是这样的:

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
之后,我们使用 参数替换 来提取逗号
,
之前的部分以及逗号之后的部分。


15
投票

在 bash 中,我们使用

declare -A name_of_dictonary_variable

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

例如那么你想创建

sounds
字典,

declare -A sounds

sounds[dog]="Bark"

sounds[wolf]="Howl"

其中

dog
wolf
"keys"
Bark
Howl
"values"

您可以使用以下方式访问所有值:

echo ${sounds[@]}
echo ${sounds[*]}

您只能使用以下方式访问所有密钥:

echo ${!sounds[@]}

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

${sounds[dog]}

这将为您提供键 (

Bark
) 的值 (
dog
)。


3
投票

对于持久键/值存储,您可以使用

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 [email protected]

#read the varible
kvget myEmail

#you can also use in another script with $(kvget keyname)
echo $(kvget myEmail)

2
投票
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)

1
投票

在不支持

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

0
投票

之前的回答非常好;让我们把它变得简单一点:

value_of_key1=value1
value_of_key2=value2
value_of_key3=value3
key="key2"
# here comes the looked-up value
eval echo \$value_of_$key # output is "value2"
© www.soinside.com 2019 - 2024. All rights reserved.