Linux管理・運用の基本
システム管理者のための実践ガイド
システム管理者のための実践ガイド
Linuxのシステム運用では、同じ作業を何度も繰り返す場面が多々あります。「毎日ログをチェックしたい」「複数ファイルを一括で処理したい」——そんな時に頼りになるのがシェルスクリプトです。
本記事では、シェルスクリプトの基本である繰り返し処理(forループ)と条件分岐(if文)の使い方を、具体例とともに解説します。
forループで繰り返し処理をする方法if文で条件分岐する方法forとifを組み合わせた実用例シェルスクリプトは、コマンドを上から順に実行するテキストファイルです。最初の行には「どのシェルで実行するか」を指定するシバン(shebang)を書きます。
#!/bin/bash
利用するシェルに応じて/bin/shや/bin/zshに書き換えてもOKです。
作成したスクリプトには実行権限を付与しましょう。
# myscript.shを作成したら
$ chmod +x myscript.sh
# 実行する
$ ./myscript.sh
chmod +xは、ファイルに実行権限を付与するコマンドです。
forループで繰り返し処理複数のファイルをまとめて処理したい場合、forループが非常に役立ちます。例えば、特定のディレクトリ内の全ての.logファイルの拡張子を.bakに変更したいといった場合に利用できます。
forループの基本的な使い方forループの構文は以下の通りです。
for 変数 in リスト
do
# 実行するコマンド
done
リストに指定された要素が1つずつ変数に代入され、doからdoneの間の処理が繰り返されます。
以下の例では、現在のディレクトリにあるtest1.txt、test2.txt、test3.txtの3つのファイル名を画面に出力します。
#!/bin/bash
# ファイルリストを定義
file_list="test1.txt test2.txt test3.txt"
# リストの各要素を file 変数に代入してループ
for file in $file_list
do
echo "ファイル名: $file"
done
実行すると以下のように表示されます。
ファイル名: test1.txt
ファイル名: test2.txt
ファイル名: test3.txt
if文で条件分岐特定の条件が満たされたときだけ処理を実行したい場合はif文を使います。例えば、「ファイルが存在する場合のみ削除する」といった処理です。
if文の基本的な使い方if文の構文は以下の通りです。
if [ 条件式 ]; then
# 条件が真(True)の場合に実行されるコマンド
elif [ 別の条件式 ]; then
# 最初の条件が偽で、2つ目の条件が真の場合
else
# 全ての条件が偽の場合に実行されるコマンド
fi
else句やelif句は省略可能です。
条件式を囲む[と]の間には必ずスペースが必要です。これは、[と]が単なる記号ではなく、testコマンドの別名だからです。
以下の例では、myscript.shが存在するかどうかを確認し、存在すればその旨を表示します。
#!/bin/bash
file_name="myscript.sh"
if [ -f "$file_name" ]; then
echo "$file_name は存在します。"
else
echo "$file_name は存在しません。"
fi
if文でよく使われる条件式を以下にまとめます。
| チェック内容 | 条件式([ … ] 内で使う) |
|---|---|
| ファイル/ディレクトリが存在 | -e ファイル名 |
| 通常ファイルとして存在 | -f ファイル名 |
| ディレクトリとして存在 | -d ディレクトリ名 |
| 文字列の長さがゼロ | -z 文字列 |
| 文字列の長さがゼロではない | -n 文字列 |
| 文字列が等しい | 文字列1 == 文字列2 |
| 文字列が等しくない | 文字列1 != 文字列2 |
| 数値が等しい | 数値1 -eq 数値2 |
例:if [ -d /tmp/log_backup ]; then ... ← ディレクトリとして存在する場合
forとifを組み合わせた実践スクリプトforとifを組み合わせることで、より実用的なスクリプトを作成できます。例えば、「target_dir内の.logファイルのうち、特定の文字列が含まれるものだけをバックアップする」といった処理です。
以下のスクリプトは、target_dir内の.logファイルの中から「ERROR」という文字列が含まれるものだけを抽出し、backup_dirにコピーします。
#!/bin/bash
target_dir="/var/log"
backup_dir="/tmp/log_backup"
# バックアップディレクトリが存在しない場合は作成
if [ ! -d "$backup_dir" ]; then
echo "バックアップディレクトリ $backup_dir を作成します。"
mkdir -p "$backup_dir"
fi
# 対象ディレクトリ内の.logファイルをループ
for log_file in "$target_dir"/*.log
do
# ファイルが存在するか確認(ワイルドカードが展開されない場合のため)
if [ -f "$log_file" ]; then
# ファイル内に"ERROR"が含まれているか確認
if grep -q "ERROR" "$log_file"; then
echo "$log_file に 'ERROR' が含まれています。バックアップします。"
cp "$log_file" "$backup_dir"
fi
fi
done
echo "バックアップ処理が完了しました。"
このスクリプトは、以下のポイントを押さえています。
for log_file in "$target_dir"/*.log: /var/logディレクトリ内のすべての.logファイルを対象にループします。forループでワイルドカード(*)が使えます。if [ ! -d "$backup_dir" ]: 否定の!演算子を使って「ディレクトリが存在しない場合」という条件を表現しています。if grep -q "ERROR" "$log_file": grepコマンドに-q(quiet)オプションを付けることで、結果を表示せず、一致する行が見つかったら終了コード0(成功)を返します。if文はこの終了コードで真偽を判定します。この記事では、シェルスクリプトの基礎となる繰り返し処理のforと、条件分岐のifについて解説しました。これらの構文を組み合わせることで、日々のLinux運用・管理作業を大幅に効率化できます。
forループ:複数のファイルをまとめて処理するなど、定型的な繰り返し作業に利用します。if文:ファイルの存在確認や特定の文字列の有無など、条件に応じて処理を分岐させます。自分で書いたスクリプトは、必ずテスト用ディレクトリなどで動作確認してから本番運用に使いましょう!実行前にechoで確認したり、テスト用ディレクトリで事前に動作確認する習慣をつけましょう。
この記事が、シェルスクリプトの理解を深める一助となれば幸いです。ご覧いただきありがとうございました。次回はファイルシステムの種類と特徴について解説します。