概要

bashのfor文で、1ずつ加算し、
演算後、2桁の数値になるように先頭を0埋めした値
(欲しい出力は01,02,03,04,05,....10,11,12 というかんじ)
を出力させるということをしたかった。
そのときの試行錯誤3つをまとめたもの

まとめ

1.先頭0埋めの数値に加算すると通常の数値になる、
2.$((a+b))の演算では、先頭0埋めの数値は8進数とみなされ、08以上の値への加算ができない
3.exprを使うと、先頭0埋めの数値も10進数として計算可能

その1

先頭を0埋めした数値に加算をする。

#!/bin/bash
id=`printf %02d 6` #2桁になるよう1桁のものは0埋めする、ここでは'06'

echo $id
for i in ` seq 1 6`
do
  id=$((id + 1))
done

結果:
最初のechoでは、0埋めの$idが出力されているが、
加算後は1桁の$idになっていることより、
先頭0埋めの数値に加算すると通常の数値になる
例)06+1=7, 06+2=8, 06+3=9.......

06
7
8
9
10
11
12

その2

その1より、加算後に0埋めが無効になることがわかったので、ループの最後に0埋め変換する

#!/bin/bash
id=6
echo $id

for i in ` seq 1 6`
do
  echo "ループ開始 ${id}"
  echo "$id +1"
  id=$((id+1))
  echo "加算後 ${id}
  id=`printf %02d $id`

done

結果:
06+307+3は計算できるが、08+1は計算ができず、途中で止まってしまう。
先頭に0がついていると8進数にみなされるため、計算できないよう。
(8進数では8や9は存在せず、1~7が終わったら11~17, 21~27 となる)

6
ループ開始 6
6 +1
加算後 7
0埋め変換後 07
ループ開始 07
07 +1
加算後 8
0埋め変換後 08
ループ開始 08
08 +1
ベースの値には大きすぎます

その3

その2の対処方法。0埋めの数値を8進数ではなく10進数として計算する。

#!/bin/bash
id=6
echo $i

for i in ` seq 1 6`
do
   echo "ループ開始 ${id}"
   echo "$id +1"
    id=`expr $id + 1`
    echo "加算後 $id"
    id=`printf %02d $id`
   echo "0埋め変換後 ${id}"
done

結果:
exprを使うと、0が先頭についている値も10進数として計算してくれる。
※計算できるが0埋めは消えるので出力の際に0埋めをする必要がある。

6
ループ開始 6
6 +1
加算後 7
0埋め変換後 07
ループ開始 07
07 +1
加算後 8
0埋め変換後 08
ループ開始 08
08 +1
加算後 9
0埋め変換後 09
ループ開始 09
....
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.