Arrays bash 5.1.4索引中带句点的关联数组适用于一条语句,但不适用于另一条语句

Arrays bash 5.1.4索引中带句点的关联数组适用于一条语句,但不适用于另一条语句,arrays,bash,Arrays,Bash,正如标题所述,名称中带有句点的索引在对函数的一次调用中正确设置,但在引用索引以赋值时却没有设置。我只发现了另一个问题,答案是将数组声明为关联数组。(我已经有了。) 脚本的相关部分: #!/usr/bin/env bash declare -Ag root_dict sub_dict1 sub_dict2 object=0.7.0-rc1 #parsed from file _set_key $object # called from

正如标题所述,名称中带有句点的索引在对函数的一次调用中正确设置,但在引用索引以赋值时却没有设置。我只发现了另一个问题,答案是将数组声明为关联数组。(我已经有了。)

脚本的相关部分:

#!/usr/bin/env bash

 declare -Ag root_dict sub_dict1 sub_dict2 
 object=0.7.0-rc1                           #parsed from file

_set_key $object
# called from another part of script 

_set_key() { 

if [[ -z $last_obj ]]; then            # first object parsed.
    root_dict_key="$object"            
    last_obj="$object"
    last_key="$object"
    object=""

    root_dict[$root_dict_key]=""        # i haven't parsed the value yet
    last_dict=root_dict
    last_key=root_dict_key
    return

elif [[ -n $sub_dict ]]; then 
                                        # parsed another object to get the array value.
                                        # value is also a key, to reference another array.
    object=files                        # argument sent with caller

                                        # indirect referencing because the referenced array \ 
    dict_key="${!last_dict}"            # is dynamic
    dict_key[$last_key]="$object"
    last_obj="$object"
    last_val="$object"
    object=""
    return

fi
}
第一个
if
语句正确设置了键<代码>根目录[0.7.0-rc1]=“代码”

当我在下一次调用
\u set\u key
elif
语句中设置该键的值时,我得到:

line 136: 0.7.0-rc2: syntax error: invalid arithmetic operator (error token is ".7.0-rc2")

我知道变量名除了下划线外不能有标点符号,但另一个答案表明关联数组索引是字符串文字。为什么索引在第一次调用中正确设置,但在第二次调用中返回错误?调用方在这两种情况下都是相同的,首先发送
object=0.7.0-rc1
,然后发送
object=files

查看您的代码,可能是您想要编写的

dict_key="${!last_dict}"
root_dict_key[$last_key]="$object"
。。。而不是

dict_key="${!last_dict}"
dict_key[$last_key]="$object"
dict_key
未声明为关联数组。当bash看到赋值
dict_键[$last_键]=“$object”
(注意
[…]
)时,非关联
dict_键将被解释为常规数组


正则数组的大括号打开了一个算术上下文。Bash算术上下文无法解释浮点数,因此会显示错误消息。

使用shellcheck.net检查脚本,它会出现问题,linter会告诉您必须在调用函数之前定义函数
\u set\u key