Bash将关联数组键解释为八进制数

时间:2018-04-06 17:25:48

标签: bash associative-array

如何防止此失败:

a[5c8]=1
-bash: 5c8: value too great for base (error token is "5c8")

似乎bash将5c8解释为八进制数。显然,我可以在键中添加前缀并在使用数组后删除该前缀,但我希望有更优雅的解决方案。

Bash 4.3.48。

2 个答案:

答案 0 :(得分:6)

所有数组键都被解释为数字(或要计算的变量名称以获取数字),除非您将数组声明为关联数,与declare -A一样:

#!/usr/bin/env bash
case $BASH_VERSION in ''|[1-3].*) echo "Bash 4.0+ required" >&2; exit 1;; esac

declare -A a
a[5c8]=1

答案 1 :(得分:4)

首先,您有一个索引数组,因此索引在算术上下文中计算。

其次,任何以数字开头的字符串都将被视为数字,而不是带有数字值的标识符。

}

那么5c8是多少? $ foo=3 $ a[foo]=5 $ declare -p a declare -a a=([3]="5") 提供了丰富的数字文字:

  

前导0的常量被解释为八进制数。领先          0x或0X表示十六进制。否则,数字采用表格          [base#] n,其中可选基数是介于2和64之间的十进制数          表示算术基数,n是该基数中的数字。如果          省略base#,然后使用base 10。指定n时,数字          大于9的小写字母用大写字母表示          字母,@和_,按此顺序。如果base小于或等于36,          小写和大写字母可以互换使用,以表示10到35之间的数字。

它不是基数10中的有效常量(默认值)。 对13或更高版本有效,但bash不会尝试猜测你的意思。

所有这一切,你可能意味着将其视为文字字符串,在这种情况下,您需要将数组声明为关联数组,以便不在算术上下文中计算索引。

bash