##概要
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+3
、07+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
....