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

RKS*_*RKS 67 bash shell

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

declare -d dictionary
defaults write "$dictionary" key -string "$value"
Run Code Online (Sandbox Code Playgroud)

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

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

pet*_*hes 131

在bash版本中引入了4个关联数组.

declare -A arr

arr["key1"]=val1

arr+=( ["key2"]=val2 ["key3"]=val3 )
Run Code Online (Sandbox Code Playgroud)

arr数组现在包含三个键值对.Bash是相当有限的,你可以用它们做什么,没有排序或弹出等.

for key in ${!arr[@]}; do
    echo ${key} ${arr[${key}]}
done
Run Code Online (Sandbox Code Playgroud)

将遍历所有键值并回显它们.

  • 值得注意的是,由于其GPLv3许可证,Bash 4不附带Mac OS X. 你必须下载并安装它.(Apple仍然发布Bash 3.2.) (16认同)
  • 这里有一个骗局:迭代不按插入顺序排序. (4认同)
  • 这不是因为 GPLv3 许可,而是因为 Apple 不想使用 GPLv3 许可的软件。所以我认为 GPLv3 许可证没有问题,但 Apple 有问题。 (2认同)

mat*_*ath 30

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

for i in a,b c_s,d ; do 
  KEY=${i%,*};
  VAL=${i#*,};
  echo $KEY" XX "$VAL;
done
Run Code Online (Sandbox Code Playgroud)

在这里i充满了像"a,b"和的字符序列"c_s,d".每个都用空格分隔.之后do我们使用参数替换来提取逗号之前,的部分和之后的部分.


小智 12

在 bash 中,我们使用

declare -A name_of_dictonary_variable
Run Code Online (Sandbox Code Playgroud)

这样 Bash 就知道它是一本字典。

例如你想创建sounds字典,

declare -A sounds

sounds[dog]="Bark"

sounds[wolf]="Howl"
Run Code Online (Sandbox Code Playgroud)

哪里dogwolf"keys",并且BarkHowl"values"

您可以使用以下命令访问所有值:echo ${sounds[@]}ORecho ${sounds[*]}

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

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

${sounds[dog]}

这将为您提供Bark键 ( ) 的值 ( dog)。