このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Linuxコマンドの基本:シェルスクリプトのfor文

シェルスクリプトのfor文

 シェルスクリプトにおけるfor文は、スペースやタブで区切られた単語のリストに対して繰り返し処理を行うための構文です。リスト内の各要素に対して、doからdoneまでに記述された処理が順次実行されます。

for文の基本構造

for 変数名 in リスト
do
  # 繰り返す処理
done
  • 変数名:リストから取り出した要素の値が代入されます。
  • リスト:繰り返し処理を行いたい要素の集合をスペース区切りで記述します。

簡単な例:名前のリストを表示する

 まずは基本的なfor文の例を見てみましょう。以下のシェルスクリプトでは、memberという変数にAibaMatsumotoNinomiyaOhnoSakuraiの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 $membermemberの値を表示します。

実行権限の付与

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"00iを組み合わせたファイル名の空ファイルを作成します。

実行権限の付与

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文を活用することで、さまざまな繰り返し処理を簡潔に記述することができます。これらの知識をもとに、効率的なスクリプト作成に挑戦してみてください。