如何防止此失败:
a[5c8]=1
-bash: 5c8: value too great for base (error token is "5c8")
似乎bash将5c8解释为八进制数。显然,我可以在键中添加前缀并在使用数组后删除该前缀,但我希望有更优雅的解决方案。
Bash 4.3.48。
答案 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