采购的declare -p
一个有效的击关联阵列,其中键包含在一个方括号结果结果键坚持和恢复关联数组坏数组下标错误。
测试程序
务必:
$ declare -A array
$ key='var[0]'
$ array["$key"]=37
$ echo ${array["$key"]}
37
$ declare -p array > def.sh
$ cat def.sh
declare -A array='(["var[0]"]="37")'
$ . def.sh
bash: [var[0]]=37: bad array subscript
在上面的代码,备注:
- 我能够指定包含方括号的关键:
var[0]
- 关键是引用了setter和getters
- 我可以用做一个分配这一关键
- 我能够使用此键
- 使用
declare -p
我可以这样定义保存到一个文件从关联数组获得的价值:def.sh
- 当源文件
def.sh
发出错误。
我的环境
- 我使用的Bash的版本是4.2.46 (1)-release下(x86_64-红帽Linux的GNU的)。
- 我在CentOS的1611年3月7日(核心)服务器
解决办法
如果不是做declare -p array > def.sh
我这样做,而不是:
{
echo 'declare -A array'
for Key in "${!array[@]}"; do
EscapedKey="$(sed 's|"|\\"|g' <<<"$Key")"
echo "array[\"$EscapedKey\"]=${array["$Key"]}"
done
} > def.sh
然后采购的DEF .sh文件起作用。请注意,在上面的例子中,我也在转义引用字符,这可能是键的一部分。我明白,我上面的内容并不详尽。由于这些复杂因素,如果可能的话,我宁愿选择不涉及此类解决方法的解决方案。
问题
有一些shopt
,set -o <option>
,或别的东西,我可以做,使我坚持一个关联数组,它的键可能包含括号或其他特殊字符的文件,并在以后能够成功发送该文件?我需要一个可以在我的环境中工作的解决方案。
对上述解决方法的改进可能包括使用'%q'使用'printf'。再次,我希望有一个解决方案,涉及'declare -p'和可能的一些行为改变命令;然而,如果这只是Bash 4.2.26(1)发布中的一个bug,那么我的目标将转向一个强大的解决方案,或许是我上面显示的改进。 –
我刚刚使用bash 4.4在Arch Linux上进行了测试,并且没有这样的问题 - 我可以像使用字符串那样使用字符串,不需要解决方法。我试图找到4.2和4.4之间的所有变化的一些参考,看看这是固定的,或者如果后来的版本只是改变了行为。 – mechalynx
好吧,我不确定这是相关的,但我发现它可能是一个错误的轻微提示。我从http://ftp.gnu获得了资源。org/gnu/bash/- 在bash 4.4的源文件中有'CHANGES'下的完整更新日志。第2370行:“e。修复了在关联 数组赋值和扩展中读取下标时遇到的几个错误 ” - 可能是这样,但使用'shopt -s compat42'似乎对我的环境没有任何影响,所以我如果不重新编译bash,我不确定如何测试。 – mechalynx