シェルスクリプトを使って何らかの検証をする時に、連番かつ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コマンドではできなかったので、
$()
でコマンドを囲む方法でできました。
コメントで指摘していただきました。
シングルクォートではなく「`」バッククォートで囲む方法でした。
桁数を指定して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」が実現できます。
まとめ
すでに同じような記事たくさんあるのですが、for文のリスト指定の部分でコマンドを''
で囲むやり方の記事ばかりで、
私の環境ではそれでは動かなかったのであえて記事載せます。
$()
で囲む方法でできました。
なぜ別の方はできて私の環境ではできないのか、理由まではわかっていないのでご存知の方いらしたらご教示いただけると幸いです。
(実行環境はMacでzshです)
コメントで指摘していただきました。
「`」バッククォートではなくシングルクォートでやってしまっているためでした。
普段使用しているPHPやJSではバッククォートを使うことがまずないので、完全にシングルクォートだと思いこんでいました・・・。