LoginSignup
1
1

More than 1 year has passed since last update.

【シェルスクリプト】連番かつ0埋めの数字を使う

Last updated at Posted at 2021-06-03

シェルスクリプトを使って何らかの検証をする時に、連番かつ0埋めの数字を使いたい時があると思います。
例)001 002 003 004 005 ...

シェルスクリプトの書き方がわかっていれば簡単なのかもしれませんが、
普段シェルスクリプトを書き慣れていない私は書き方で苦戦したので書いておきます。

ユースケースとしてわかりやすくするため、ここでは数字の連番を含むファイル名のテキストを作成してみます。

普通の連番の数字にする時

#!/bin/sh
for i in {1..100}
do
touch test-${i}.txt
done

実行結果
test-1.txt
test-2.txt
test-3.txt
.
.
.
test-100.txt

桁数が不揃いの数字の連番でも構わない場合はこれでいけます。
for i in {1..100}の部分で、1から100の数字が変数iに代入され、
for文の中で${i}とすることで参照できます。
 ※参照する変数の書き方については複数ありますので、一例ということで。

桁数を合わせて0埋めの連番の数字にする時

#!/bin/sh
for i in $(seq -w 1 100)
do
touch test-${i}.txt
done

実行結果
test-001.txt
test-002.txt
test-003.txt
.
.
.
test-100.txt

基本は数字の桁数を揃えたいことがほとんどだと思います。
for文のinの右のリスト指定の部分ではコマンドの実行結果を指定することもできます。
seqコマンドを使用し、-wオプションをつけることで、0埋めの数字になります。
seq -w 1 100の部分)

ちなみにリスト指定の部分でコマンドの実行結果を指定する方法ですが、
コマンドを''で囲むだけで使用できる場合もありますが、私の場合seqコマンドではできなかったので、
$()でコマンドを囲む方法でできました。

コメントで指摘していただきました。
シングルクォートではなく「`」バッククォートで囲む方法でした。

参考:【シェルスクリプト】(繰り返し)for文

桁数を指定して0埋めの連番の数字にする時

#!/bin/sh
for i in $(seq -f '%04g' 1 100)
do
touch test-${i}.txt
done

実行結果
test-0001.txt
test-0002.txt
test-0003.txt
.
.
.
test-0100.txt

桁数に指定があり、最大値の数字でも先頭に0を入れたい場合があるかもしれません。
(使う数字的には100までだけど、桁数は4桁指定で「0100」にしたい場合など)

その場合は上記のようにseqコマンドの-fオプションを使用することでできます。
-fオプションをつけることで書式が指定できますので、今回のように4桁にしたければ'%4g'
更に0埋めしたければ'%04g'とすることで「0100」が実現できます。

参考:【 seq 】コマンド――数字の列を出力する

まとめ

すでに同じような記事たくさんあるのですが、for文のリスト指定の部分でコマンドを''で囲むやり方の記事ばかりで、
私の環境ではそれでは動かなかったのであえて記事載せます。
$()で囲む方法でできました。
なぜ別の方はできて私の環境ではできないのか、理由まではわかっていないのでご存知の方いらしたらご教示いただけると幸いです。
(実行環境はMacでzshです)

コメントで指摘していただきました。
「`」バッククォートではなくシングルクォートでやってしまっているためでした。
普段使用しているPHPやJSではバッククォートを使うことがまずないので、完全にシングルクォートだと思いこんでいました・・・。

参考

【シェルスクリプト】(繰り返し)for文
【 seq 】コマンド――数字の列を出力する

1
1
6

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
1
1