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

Posted

技术标签:

【中文标题】有没有办法在 Bash 脚本中创建键值对?【英文标题】:Is there a way to create key-value pairs in Bash script? 【发布时间】:2012-12-31 11:08:06 【问题描述】:

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

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

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

【问题讨论】:

我正在研究 bash。自己想了一个办法。 使用这个也有帮助:urls+=( 'key1'$value1'key2'$value2'key3'$value3'' 太棒了!您可以(甚至鼓励)在 *** 上回答自己的问题,这样您就可以帮助处于类似情况的其他人。 如果您包含一些示例用法和输出,我会支持您的答案。祝你好运。 【参考方案1】:

在 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

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

注意:由于其 GPLv3 许可证,Bash 4 不随 Mac OS X 一起提供;你必须下载并安装它。有关更多信息,请参阅here

【讨论】:

重要的是要注意,由于其 GPLv3 许可证,Bash 4 没有随 Mac OS X 一起提供;你必须下载并安装它。 (Apple 仍然发布 Bash 3.2。) 这里有个缺点:迭代不是按插入顺序排列的。 绝对需要 bash 版本 4。否则声明 -A 不起作用。 Mac 自带 bash 3.2 这不是因为 GPLv3 许可,而是因为 Apple 不想使用 GPLv3 许可软件。因此,我认为 GPLv3 许可证没有问题,但 Apple 有问题。【参考方案2】:

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

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 来提取逗号, 之前的部分和它之后的部分。

【讨论】:

你能解释一下你给出的例子吗? 问题:如果b是一个包含空格的变量,它会起作用吗? 在我的示例中,b 不是变量,不,它不起作用,因为 for 循环的列表是空格分隔的。【参考方案3】:

在 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]

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

【讨论】:

【参考方案4】:

对于持久键/值存储,您可以使用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 xyz@example.com

#read the varible
kvget myEmail

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

【讨论】:

【参考方案5】:
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)

【讨论】:

【参考方案6】:

在不支持 declare -A 的旧 bash(或 sh)中,可以使用以下样式来模拟键/值

# 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

【讨论】:

以上是关于有没有办法在 Bash 脚本中创建键值对?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 GraphQL 中表示键值对的对象

如何从键值对列表中创建 Spark Row

我可以在 TypeScript 中创建一个对每个键值对都是类型安全的键值字典吗?

如何在 Flutter 中创建和读取一组键值对(映射)以在 Firestore 中存储数据

使用 Lodash 从键值对数组中创建对象

Kafka Consumer 获取键值对