如何解决Bash关联数组键被解析为八进制数的报错
解决Bash中
a[5c8]=1的报错问题 这个问题我之前也碰到过,其实是Bash数组的解析规则在搞鬼:
报错原因
当你给普通数组(未声明为关联数组的数组)赋值时,如果下标是不带引号、以数字开头的字符串,Bash会自动尝试把它解析成整数。而这里的5c8以数字5开头,后面跟着非十进制的c,Bash会默认按八进制数来解析——但八进制数只能包含0-7的数字,c显然不符合要求,所以就抛出了-bash: 5c8: value too great for base (error token is "5c8")的错误。
优雅解决方案
最适合你的优雅方案是使用关联数组,Bash 4.0及以上版本都支持关联数组,你的4.3.48版本完全兼容。关联数组允许用任意字符串作为键,不会把键解析成数字,完美解决你的需求。
操作步骤很简单:
- 先声明关联数组:
declare -A a
- 接着直接赋值就不会报错了:
a[5c8]=1
你也可以在声明数组的同时完成赋值:
declare -A a=(["5c8"]=1)
不推荐的临时方案(仅作补充)
如果因为特殊原因不能用关联数组,你可以尝试给下标加引号强制当作字符串处理:
a["5c8"]=1
但要注意:普通数组的下标必须是整数,所以这种写法依然会报错(因为5c8不是有效整数),这只是让Bash不再尝试解析它为八进制,但本质上解决不了普通数组接受非整数键的问题,因此关联数组才是真正靠谱的方案。
内容的提问来源于stack exchange,提问作者Thomas Daniel
相关产品推荐
相关产品推荐

