2013-01-17 43 views
49

我想创建一个使用Bash脚本的键值对的字典。我正在尝试使用此逻辑:有没有办法在Bash脚本中创建键值对?

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

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

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

+0

在哪个shell? – Johnsyweb

+0

我正在bash上工作。想通过一种方法来做到这一点。 – RKS

+0

使用,这也有助于:网址+ =( ' key1的 '$值1'键2 '$值2' KEY3 '你自己也可以'' – RKS

回答

96

在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 

将循环在所有键值和回声出来。

+4

+1。不需要引用键虽然 –

+8

重要的是要注意,由于其GPLv3许可证,Bash 4没有随Mac OS X一起提供;您必须下载和安装高了吧。 (苹果仍然运送Bash 3.2。) – PleaseStand

+0

真棒,很高兴知道这个...... :) – RKS

23

如果你可以用一个简单的分隔符,很简单的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来提取逗号,之前的部分和其后的部分。

+0

你能解释一下你给的例子吗? –

+0

问题:如果'b'是一个包含空格的变量,它会起作用吗? –

+0

在我的例子中,b不是一个变量,也不会工作,因为for循环的列表是空格分隔的。 – math

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) 
相关问题