
シェルの1D配列が下付き文字/インデックス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と0で始まる数字は8進数として解釈されます。 8進法には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