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
で確認したり、テスト用ディレクトリで事前に動作確認する習慣をつけましょう。
この記事が、シェルスクリプトの理解を深める一助となれば幸いです。ご覧いただきありがとうございました。次回はファイルシステムの種類と特徴について解説します。