bash - 在 bash 中动态创建关联数组

标签 bash shell

我有一个包含以下名称/值对的变量 ($OUTPUT):

member_id=4611686018429783292
platform=Xbox
platform_id=1
character_id=2305843009264966985
period_dt=2020-11-25 20:31:14.923158 UTC
mode=all Crucible modes
mode_id=5
activities_entered=18
activities_won=10
activities_lost=8
assists=103
kills=233
average_kill_distance=15.729613
total_kill_distance=3665
seconds_played=8535
deaths=118
average_lifespan=71.72269
total_lifespan=8463.277
opponents_defeated=336
efficiency=2.8474576
kills_deaths_ratio=1.9745762
kills_deaths_assists=2.411017
suicides=1
precision_kills=76
best_single_game_kills=-1

每行以 \n 结尾。

我想遍历它们,并将它们解析成一个关联数组,并通过变量名访问数组中的值:

while read line
do
    key=${line%%=*}
    value=${line#*=}

    echo $key=$value
    data[$key]="$value"

done < <(echo "$OUTPUT")

#this always prints the last value
echo ${data['seconds_played']}

这似乎有效,即 key/value 打印正确的值,但是当我尝试从数组中提取任何值时,它总是返回最后一个值(在这种情况下 - 1).

我觉得我错过了一些明显的东西,但我的头已经撞了几个小时了。

更新:我的特殊问题是我正在运行不支持关联数组的 bash 版本(OSX 上为 3.2.57)。我会在下面标记正确的答案。

最佳答案

如果没有declare -A data,那么data就是一个普通数组。 [here] 中的普通数组表达式首先进行扩展,然后进行算术扩展。内部算术扩展未设置变量扩展为 0。您实际上只是设置 data[0]=something,因为 data[$key]data[seconds_played] -> 变量 seconds_played 没有定义,所以扩展为 data[0]

添加 declare -A data 并且它“应该可以工作”。你也可以:

declare -A data
while IFS== read -r key value; do
    data["$key"]="$value"
done <<<"$OUTPUT"

关于bash - 在 bash 中动态创建关联数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65115761/

相关文章:

bash - bash 中 "$*"有哪些用例?

linux - 如何仅从命令行(无图形用户界面)在 Linux (ec2/ubuntu) 上运行/执行 adobe AIR 文件

c++ - 将 C 或 C++ 文件作为脚本运行

linux - 如何知道当前季度的日期?

bash - shell 脚本 : Using a variable to define a path

bash - 运行 kubectl exec 时禁用 Kubernetes 上的网络日志

linux - Sed 在位置前插入符号

shell - 如何否定进程的返回值?

c++ - 从 Apache 正在运行的 C++ 代码调用 bash 脚本的权限问题

bash - docker-machine ssh尝试在本地机器上运行部分命令