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
。