在Bash中动态创建关联数组

3

我有一个变量($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)。我将在下面标记正确答案。


typeset -p data 显示什么? - markp-fuso
${data['seconds_played']}?我得到了一个语法错误。 - KamilCuk
在MacOS上,使用Homebrew安装Bash版本5非常简单。 - glenn jackman
是的,我已经更新了它。我试图制作一个使用默认 shell 的东西,因为这是供其他人使用的示例。 - mikechambers
2个回答

4

如果没有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"

1
如果我声明-A data或typeset -A data,我会得到这个错误:“declare:-A:无效选项”。我在bash 3.2.57上(在OS X上)。 - mikechambers
1
你的bash版本是3.2.57,它不支持关联数组。这个版本太旧了。 - KamilCuk
好的,我想那就是问题所在了。我会尝试在zsh中执行,虽然它已经给我报了一些错误。 - mikechambers

3

在填充数组之前,尝试将data声明为关联数组,例如:

$ typeset -A data                   # declare as an associative array
$ while read line
do
    key=${line%%=*}
    value=${line#*=}

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

done <<< "${OUTPUT}"

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

$ echo "${data['seconds_played']}"
8535

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接