16
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

先頭0埋めの値の演算

Posted at

##概要
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埋めした数値に加算をする。

.bash
#!/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埋め変換する

.bash

#!/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進数として計算する。

.bash

#!/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
....
16
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?