我可以创建一个 关联数组 并将一个整数分配给一个包含一个 单引号 中。
$ 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]++ ")
我总是得到同样的错误。我到底做错了什么?
中的单引号 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}"]++ ))
关闭多重评价* 用下面的命令将关联数组的下标删除就可以了。
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")