首页 > 解决方案 > 尝试递增关联数组元素时出现错误的数组下标错误

问题描述

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

$ 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]++ ")

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

标签: bashassociative-array

解决方案


名称中的单引号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快捷方式%qprintf()

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

推荐阅读