当试图递增一个关联数组元素时,出现数组下标错误。

问题描述 投票:2回答:1

我可以创建一个 关联数组 并将一个整数分配给一个包含一个 单引号 中。

$ declare -A dict
$ var="john's"
$ dict[$var]=1
$ echo ${dict[$var]}
1
$ declare -p dict
declare -A dict=(["john's"]="1" )

但当我尝试增加它的值时..:

$ (( dict[$var]++ ))
bash: ((: dict[john's]++ : bad array subscript (error token is "dict[john's]++ ")
$ (( dict["$var"]++ ))
bash: ((: dict[john's]++ : bad array subscript (error token is "dict[john's]++ ")
$ (( dict["${var}"]++ ))
bash: ((: dict[john's]++ : bad array subscript (error token is "dict[john's]++ ")

我总是得到同样的错误。我到底做错了什么?

arrays bash associative
1个回答
4
投票

中的单引号 key 的名称导致解析器将其视为未结束的引号字符。解决这个问题的一个方法是转义的 ' 钥字

key="john's"
printf -v escKey "%q" "$key"

现在因为 %q 指定者。printf() 将会对所有的shell元字符应用必要的转义符,即使它成为 "shell-引号 "并可重复使用。如果你打印 escKey 你会发现 ' 逃逸

printf '%s\n' "$escKey"
john\'s

现在你可以在你的关联数组中使用这个键名。记住,你可以随时手动添加转义符,这可能会很混乱。由于 %q 是shell提供的原生方式,使用它要安全得多。

(( dict["$escKey"]++ ))

此外,在 bash 版本>=4.4 参数扩展@Q 的捷径,也就是 %q 的指明者 printf() 用它

(( dict["${key@Q}"]++ ))

4
投票

关闭多重评价* 用下面的命令将关联数组的下标删除就可以了。

shopt -s assoc_expand_once

* 一个例子显示了默认行为和 assoc_expand_once的影响。

$ v1=42
$ v2='$v1'
$ declare -A foo
$ foo[$v2]=
$ declare -p foo
declare -A foo=(["\$v1"]="" )
$ (( foo[$v2]++ ))
$ declare -p foo
declare -A foo=([42]="1" ["\$v1"]="" )
$
$ shopt -s assoc_expand_once
$ (( foo[$v2]++ ))
$ declare -p foo
declare -A foo=([42]="1" ["\$v1"]="1" )
© www.soinside.com 2019 - 2024. All rights reserved.