shell 中的一维数组不适用于大于 08 的索引

shell 中的一维数组不适用于大于 08 的索引

我一直想知道为什么shell中的一维数组对于子脚本/索引08和09不起作用。这是怎么发生的?

$ cat check

month_arr=(0 31 30 31 30 31 30 31 31 30 31 30 31)
date="10/08/10" # dd/mm/yy format used here
IFS="/"
set  $date
echo ${month_arr[$2]}

你看,当使用的下标是08和09时,就会出现下面的错误:

ravi@ravi-Aspire-5315:~/Documents/testing/shell$ ./check
./check: line 5: 08: value too great for base (error token is "08")

对于值 00 到 07,脚本正在运行。例如,如果在脚本中输入月份为 07,则输出为:

ravi@ravi-Aspire-5315:~/Documents/testing/shell$ ./check
31

对于这些子脚本,即 08 和 09,它不起作用,但如果我在月份字段中将 08 替换为 8,将 09 替换为 9,它将起作用。

$ cat check

month_arr=(0 31 30 31 30 31 30 31 31 30 31 30 31)
date="10/8/10" # dd/mm/yy format used here
IFS="/"
set  $date
echo ${month_arr[$2]}

这里发生了什么事?

答案1

强制 bash 使用基数 10:

echo "${month_arr[10#$2]}"

以 1 开头的零的数字被解释为八进制数。八进制没有8和9:

Octal 1 = decimal 1
Octal 2 = decimal 2
Octal 3 = decimal 3
...
Octal 6 = decimal 6
Octal 7 = decimal 7
Octal 10 = decimal 8
Octal 11 = decimal 9
Octal 12 = decimal 10
Octal 13 = decimal 11

相关内容