このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。
Linuxコマンドの基本:シェルスクリプトのfor文
シェルスクリプトのfor文
シェルスクリプトにおけるfor
文は、スペースやタブで区切られた単語のリストに対して繰り返し処理を行うための構文です。リスト内の各要素に対して、do
からdone
までに記述された処理が順次実行されます。
for文の基本構造
for 変数名 in リスト
do
# 繰り返す処理
done
- 変数名:リストから取り出した要素の値が代入されます。
- リスト:繰り返し処理を行いたい要素の集合をスペース区切りで記述します。
簡単な例:名前のリストを表示する
まずは基本的なfor
文の例を見てみましょう。以下のシェルスクリプトでは、member
という変数にAiba
、Matsumoto
、Ninomiya
、Ohno
、Sakurai
の5つの名前を順に代入し、それを表示しています。
スクリプトの作成
user01@ubuntu:~$ nano for-arashi.sh
for-arashi.sh
の内容
#!/bin/bash
for member in Aiba Matsumoto Ninomiya Ohno Sakurai
do
echo $member
done
解説
for member in ...
:リスト内の各要素をmember
変数に代入します。echo $member
:member
の値を表示します。
実行権限の付与
user01@ubuntu:~$ chmod +x for-arashi.sh
スクリプトの実行
user01@ubuntu:~$ ./for-arashi.sh
Aiba
Matsumoto
Ninomiya
Ohno
Sakurai
解説
- リスト内の5つの名前が順番に表示されます。
パス名展開を利用したfor文
for
文のリスト部分には、固定の文字列だけでなく、パス名展開(グロブ)も利用できます。例えば、カレントディレクトリ内のすべての.html
ファイルに対して処理を行いたい場合、*.html
と記述します。
例:.html
ファイルの1行目を表示する
HTMLファイルの作成
まず、テスト用の.html
ファイルを3つ作成します。
user01@ubuntu:~$ echo "<h1>Title 1</h1>" > file1.html
user01@ubuntu:~$ echo "<h1>Title 2</h1>" > file2.html
user01@ubuntu:~$ echo "<h1>Title 3</h1>" > file3.html
解説
echo
コマンドで、それぞれのHTMLファイルにタイトルを1行書き込んでいます。
スクリプトの作成
user01@ubuntu:~$ nano for-html.sh
for-html.sh
の内容
#!/bin/bash
for filename in *.html
do
head -n 1 "$filename"
done
解説
for filename in *.html
:カレントディレクトリ内のすべての.html
ファイルをfilename
変数に代入します。head -n 1 "$filename"
:各ファイルの先頭1行を表示します。
実行権限の付与
user01@ubuntu:~$ chmod +x for-html.sh
スクリプトの実行
user01@ubuntu:~$ ./for-html.sh
<h1>Title 1</h1>
<h1>Title 2</h1>
<h1>Title 3</h1>
解説
- 3つのHTMLファイルの先頭行が順番に表示されます。
コマンド置換を利用したfor文
for
文のリスト部分には、コマンド置換を用いて動的にリストを生成することもできます。ここではseq
コマンドを使用して数値の連番を生成します。
seq
コマンドの基本
- 書式:
seq <開始値> <終了値>
- 機能:指定した範囲の数値列を生成します。
seq
コマンドの例
user01@ubuntu:~$ seq 1 5
1
2
3
4
5
例:連番のファイルを作成する
以下のスクリプトでは、seq
コマンドで生成した数値を用いて、001.txt
から005.txt
までの連番のファイルを作成します。
スクリプトの作成
user01@ubuntu:~$ nano for-touch.sh
for-touch.sh
の内容
#!/bin/bash
for i in $(seq 1 5)
do
touch "00${i}.txt"
done
解説
for i in $(seq 1 5)
:1
から5
までの数値をi
に代入します。touch "00${i}.txt"
:00
とi
を組み合わせたファイル名の空ファイルを作成します。
実行権限の付与
user01@ubuntu:~$ chmod +x for-touch.sh
スクリプトの実行
user01@ubuntu:~$ ./for-touch.sh
作成されたファイルの確認
user01@ubuntu:~$ ls -l 00*.txt
-rw-rw-r-- 1 user01 user01 0 11月 19 22:26 001.txt
-rw-rw-r-- 1 user01 user01 0 11月 19 22:26 002.txt
-rw-rw-r-- 1 user01 user01 0 11月 19 22:26 003.txt
-rw-rw-r-- 1 user01 user01 0 11月 19 22:26 004.txt
-rw-rw-r-- 1 user01 user01 0 11月 19 22:26 005.txt
解説
001.txt
から005.txt
までの空ファイルが作成されています。
作成したファイルの削除
実行例で作成したファイルを削除します。
user01@ubuntu:~$ rm for-arashi.sh for-html.sh for-touch.sh
user01@ubuntu:~$ rm *.html 00*.txt
まとめ
for
文の基本:指定したリストの各要素に対して繰り返し処理を行う。- リストの指定方法
・固定の文字列リストを直接記述。
・パス名展開(グロブ)を使用してファイル名のリストを指定。
・コマンド置換を使用して動的にリストを生成。 - 実用例
・メンバーの名前を順に表示。
・特定のファイルに対して一括処理を実行。
・連番のファイルを自動生成。
シェルスクリプトのfor
文を活用することで、さまざまな繰り返し処理を簡潔に記述することができます。これらの知識をもとに、効率的なスクリプト作成に挑戦してみてください。