bash - 尝试递增关联数组元素时出现错误的数组下标错误
问题描述
我可以创建一个关联数组并将一个整数分配给其中包含单引号的键:
$ 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}"]++ ))
推荐阅读
- python - 实时将远程音频流从反应发送到python
- class - 解释这个语法 Distance() :meter(0) {}
- react-native - 在 react-native 中滚动时删除 iPhone 标题
- php - Laravel 项目正在运行,但在服务器中出现错误
- java - 在python中为用户输入设置默认变量
- javascript - 如何获取表示为 Unit8Array 的图像的大小?
- c - GSL 未定义稀疏复数矩阵
- xcode - 卡在 xcode 文件上
- r - 在 R Studio 中,我将如何从 Yahoo Finance 中提取特定数据
- javascript - JavaScript 中 Map 和 For 循环的时间复杂度