シェルで「0」始まりの数字で演算をすると8進数になる

シェルで「0」始まりの数字で演算すると8進数で表現されます。これを知っていないと、外部からデータを受け取った時、固定2桁フォーマットとかで、「00」、「01」・・・といった場合に困ることがあります。

「08」と「09」は8進数となる

「08」と「09」は8進数と解釈されるので演算する際にエラーとなる

$ vi test.bash
#!/bin/bash
DATA=${1}
echo $(("${DATA}" + 1))

$ ./test.bash 07
8
$ ./test.bash 08 ・・・ 08の場合
./test.bash: line 3: 08: value too great for base (error token is "08")
$ ./test.bash 09
./test.bash: line 3: 09: value too great for base (error token is "09")
$ ./test.bash 10
11
$ ./test.bash 080 ・・・ 080の場合
./test.bash: line 3: 080: value too great for base (error token is "080")
$ ./test.bash 081
./test.bash: line 3: 081: value too great for base (error token is "081")

回避方法

シェルスクリプトで「10#」を指定すると明示的に10進数となります。

$ vi test.bash
#!/bin/bash
DATA=${1}
echo $(("10#${DATA}" + 1))

$ ./test.bash 08
9
$ ./test.bash 09
10
タイトルとURLをコピーしました