有没有一种方法可以在Bash脚本中创建键值对?


79

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

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

...哪里$dictionary是变量,但这不起作用。

有没有一种方法可以在Bash脚本中创建键值对?


我正在做bash。想出了一种自己做的方法。
RKS 2013年

使用此方法也有帮助:urls + =('<dict> <key> key1 </ key> <string>'$ value1'</ string> <key> key2 </ key> <string>'$ value2'</ string > <key> key3 </ key> <string>'$ value3'</ string> </ dict>'
RKS 2013年

3
大!您被允许(甚至被鼓励)在StackOverflow上回答您自己的问题,这样您将在类似情况下为他人提供帮助。
Johnsyweb

如果您包括一些示例用法和输出,我会赞成您的回答。祝好运。
Shellter

Answers:


149

在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一起提供。您必须下载并安装它。有关更多信息,请参见此处


25
需要特别注意的是,由于Bash 4具有GPLv3许可证,因此它不随Mac OS X一起提供。您必须下载并安装它。(Apple仍发布Bash 3.2。)
PleaseStand

5
这里有一个缺点:迭代不是按插入顺序排序的。
AlikElzin-kilaka

肯定需要bash版本4。否则,声明-A不起作用。Mac随附bash 3.2
Mamun

2
这不是因为有GPLv3许可,而是因为Apple不想使用GPLv3许可的软件。因此,我认为GPLv3许可证没什么问题,但苹果公司有什么问题。
Tech Nomad

32

如果可以使用简单的定界符,则非常简单的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我们使用参数替换来提取逗号之前,的部分和之后的部分。


您能解释一下您给的例子吗?
AlikElzin-kilaka 2016年

问题:如果b变量包含空格,是否可以使用?
AlikElzin-kilaka

在我的示例中,b不是变量,并且不行,因为for循环的列表用空格分隔。
数学

2

对于持久的键/值存储,可以使用https://github.com/damphat/kv-bash上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)

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[@]}ORecho ${sounds[*]}

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

而且,如果您希望某个特定键具有任何值,则可以使用:

${sounds[dog]}

这会给您Bark键(Dog)的值()。


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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.