Help us understand the problem. What is going on with this article?

先頭0埋めの値の演算

More than 1 year has passed since last update.

概要

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
....
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした