シェルの1次元配列は08より大きいインデックスでは機能しません。

シェルの1次元配列は08より大きいインデックスでは機能しません。

シェルの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

おすすめ記事