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

Linuxコマンドの基本:シェルスクリプト総合演習

シェルスクリプト総合演習

 これまで、さまざまなシェルスクリプトの基本構文や機能について学習してきました。ここでは、それらの知識を総合的に活用し、実用的なスクリプトを作成する総合演習を行います。この演習を通じて、シェルスクリプトの作成から実行までの流れを再確認し、理解を深めましょう。

総合演習:ファイルバックアップスクリプトの作成

演習の目的

  • コマンドライン引数の扱い方を理解する
  • 条件分岐(if文)の活用
  • ループ(for文)の利用
  • 関数の定義と使用
  • 日付・時刻情報の取得
  • ファイル操作コマンドの使用

スクリプトの概要

 指定したディレクトリ内の特定の拡張子を持つファイルを、バックアップディレクトリにコピーします。バックアップディレクトリ名には実行日時を含めます。スクリプトは以下の機能を持ちます。

  • コマンドライン引数で対象ディレクトリと拡張子を指定
  • 指定されたディレクトリが存在するか確認
  • バックアップディレクトリを作成
  • 指定された拡張子のファイルをバックアップディレクトリにコピー

スクリプトの作成と実行手順

ステップ1:スクリプトファイルの作成

ターミナルで以下のコマンドを実行し、新しいスクリプトファイルを作成します。

user01@ubuntu:~$ nano backup_files.sh

ステップ2:スクリプトの内容を記述

backup_files.sh の内容

#!/bin/bash

# コマンドライン引数の取得
TARGET_DIR="$1"
FILE_EXT="$2"

# 引数のチェック
if [ -z "$TARGET_DIR" ] || [ -z "$FILE_EXT" ]; then
    echo "使用法: $0 対象ディレクトリ 拡張子"
    exit 1
fi

# 対象ディレクトリの存在確認
if [ ! -d "$TARGET_DIR" ]; then
    echo "エラー: ディレクトリ '$TARGET_DIR' が存在しません。"
    exit 1
fi

# バックアップディレクトリ名の作成(日時を含める)
BACKUP_DIR="${TARGET_DIR}/backup_$(date +%Y%m%d_%H%M%S)"

# バックアップディレクトリの作成
mkdir "$BACKUP_DIR"

# ファイルをバックアップする関数
backup_files() {
    for file in "$TARGET_DIR"/*."$FILE_EXT"; do
        if [ -f "$file" ]; then
            cp "$file" "$BACKUP_DIR"
            echo "バックアップ: $file -> $BACKUP_DIR"
        fi
    done
}

# バックアップ処理の実行
backup_files

echo "バックアップが完了しました。バックアップ先: $BACKUP_DIR"

解説

  • コマンドライン引数の取得とチェック
    TARGET_DIRFILE_EXT をコマンドライン引数から取得します。
    ・引数が指定されていない場合、使用方法を表示して終了します。
  • ディレクトリの存在確認
    if [ ! -d "$TARGET_DIR" ] で、対象ディレクトリが存在するか確認します。
  • バックアップディレクトリ名の作成
    date +%Y%m%d_%H%M%S で現在の日時を取得し、バックアップディレクトリ名に含めます。
  • バックアップディレクトリの作成
    mkdir "$BACKUP_DIR" でバックアップディレクトリを作成します。
  • 関数 backup_files の定義と実行
    for ループで指定された拡張子のファイルを順に処理します。
    ・ファイルが存在する場合、cp コマンドでバックアップディレクトリにコピーします。
  • バックアップ完了メッセージの表示

ステップ3:実行権限の付与

スクリプトに実行権限を与えます。

user01@ubuntu:~$ chmod +x backup_files.sh

ステップ4:テスト用のディレクトリとファイルの作成

テスト用にディレクトリとファイルを作成します。

user01@ubuntu:~$ mkdir test_dir
user01@ubuntu:~$ touch test_dir/file1.txt test_dir/file2.txt test_dir/image1.jpg test_dir/document.pdf

ステップ5:スクリプトの実行

指定したディレクトリ内の .txt ファイルをバックアップします。

user01@ubuntu:~$ ./backup_files.sh test_dir txt

実行結果の例

user01@ubuntu:~$ ./backup_files.sh test_dir txt
バックアップ: test_dir/file1.txt -> test_dir/backup_20241124_005025
バックアップ: test_dir/file2.txt -> test_dir/backup_20241124_005025
バックアップが完了しました。バックアップ先: test_dir/backup_20241124_005025

解説

  • test_dir 内の .txt ファイルがバックアップされています。
  • バックアップディレクトリは test_dir/backup_日時 という名前で作成されています。

ステップ6:バックアップの確認

バックアップされたファイルを確認します。

user01@ubuntu:~$ ls test_dir/backup_*
file1.txt  file2.txt

演習で作成したファイルの削除

テストで使用したファイルとディレクトリを削除します。

user01@ubuntu:~$ rm -r test_dir
user01@ubuntu:~$ rm backup_files.sh

まとめ

 この総合演習では、シェルスクリプトの基本から応用までの知識を組み合わせて、ファイルのバックアップを行うスクリプトを作成しました。コマンドライン引数の扱い、条件分岐、ループ、関数の定義、日付の取得など、実用的なスクリプト作成に必要な要素を総合的に学ぶことができました。これらの知識を活かして、より複雑なタスクを自動化するシェルスクリプトを作成してみてください。