第5章:実践演習 - 簡単なスクリプト作成

5.0 この章で学ぶこと

  • シェルスクリプトの最小構成(shebang/コメント/コマンド実行)を作れる
  • tar や find を使った簡単な自動化の例を理解できる
  • cron で定期実行できる
実行前に確認:$ プロンプトと <user-name> プレースホルダーの読み方は、コマンド例の読み方を参照してください。

5.1 はじめてのシェルスクリプト

シェルスクリプトの概要

コマンドを順番に実行するプログラムです。繰り返し作業を自動化できます。

最初のスクリプト: hello.sh

$ vi hello.sh
#!/usr/bin/env bash
# これはコメントです
echo "Hello, Linux World!"
$ chmod +x hello.sh  # 実行権限を付与
$ ./hello.sh  # 実行
Hello, Linux World!

5.2 実践: バックアップスクリプト

完成例で使う4つの要素

  1. 変数と引用符:SOURCE="$HOME/Documents"で値を保存します。"$SOURCE"と引用すれば、空白を含むパスも1つの引数になります。
  2. コマンド置換:DATE=$(date +%Y%m%d_%H%M%S)は、dateの出力を変数へ保存します。
  3. ifと終了ステータス:コマンドは成功時に0、失敗時に0以外を返します。if tar ...; thenは、その結果で成功・失敗の処理を分けます。
  4. set -euo pipefail:-eは未処理の失敗、-uは未定義変数、pipefailはpipeline途中の失敗を検出します。ただし、ifの条件など停止しない文脈があり、後始末も自動では行いません。必要な箇所ではifとexitを明示します。

backup.sh - 重要ファイルのバックアップ

#!/usr/bin/env bash

set -euo pipefail

# バックアップ元とバックアップ先
SOURCE="$HOME/Documents"  # 実環境に合わせて変更
BACKUP_DIR="$HOME/backups"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="backup_${DATE}.tar.gz"

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

# バックアップ元の存在確認
if [ ! -d "$SOURCE" ]; then
    echo "バックアップ元が見つかりません: $SOURCE"
    echo "SOURCE を実環境に合わせて変更してください"
    exit 1
fi

# バックアップ実行
echo "バックアップを開始します: $SOURCE -> $BACKUP_DIR/$BACKUP_FILE"
if tar -czf "$BACKUP_DIR/$BACKUP_FILE" "$SOURCE"; then
    echo "バックアップ成功: $BACKUP_FILE"
    ls -lh "$BACKUP_DIR/$BACKUP_FILE"
else
    echo "バックアップ失敗"
    exit 1
fi

# 古いバックアップを削除(7日以上前)
# [注意] まず削除対象を表示し、問題なければ削除を有効化してください
find "$BACKUP_DIR" -type f -name "backup_*.tar.gz" -mtime +7 -print
# find "$BACKUP_DIR" -type f -name "backup_*.tar.gz" -mtime +7 -delete  # 実際に削除する場合はこの行のコメントアウトを外す
echo "7日以上前のバックアップを確認しました(削除を有効化している場合は削除も実行済みです)"

cronへ進む前の単体確認:まず手動実行し、終了ステータスが0で、ログに「バックアップ成功」があることを確認します。0以外なら定期実行せず、ログから原因を直します。

$ chmod +x backup.sh
$ ./backup.sh > backup.log 2>&1
$ status=$?
$ echo "$status"  # 0なら成功
$ tail -n 20 backup.log

5.3 cron で定期実行

前節で終了ステータス0とログを確認した同じスクリプトだけを登録します。

定期バックアップの設定

$ crontab -e
# 注記: /home/<user-name>/... は実環境のユーザー名に置き換える
# 事前に /home/<user-name>/logs を作成しておく(例: mkdir -p /home/<user-name>/logs)

# 毎日午前3時にバックアップ実行(ログを残す)
0 3 * * * /home/<user-name>/scripts/backup.sh >> /home/<user-name>/logs/backup.log 2>&1

cron 記法の説明

分 時 日 月 曜日 コマンド
*  *  *  *  *    command

例:
*/5 * * * *  5分ごと
                
補足:cron は対話シェルと実行環境が異なります。注意点は次のとおりです。
  • PATH が最小限のため、必要ならフルパス(例: /usr/bin/python3)を使う
  • 環境変数が引き継がれないため、必要な変数は crontab 側で定義する
  • 標準出力/標準エラーはログへリダイレクトし、失敗時に追跡できるようにする
  • 削除系ジョブは、まず -print だけで候補を確認し、対象パスと保存期間を検証してから有効化する

5.4 学習のまとめ

この章で学んだこと

  • シェルスクリプトの基本構造(shebang/コメント/実行権限)
  • 変数、引用符、コマンド置換による値の受け渡し
  • if、終了ステータス、strict modeの限界
  • 手動実行とログ確認を終えてからcronへ進む順序

スクリプト作成の要点

  • 小さく始める:手動で成功してから定期実行する
  • 失敗を残す:終了ステータスとログを確認する
  • 変更を管理する:コメントとGitで意図を残す

セキュリティの注意点

  • パスワードをスクリプトに直接書かない
  • 実行権限は必要最小限に
  • 入力値の検証を行う
  • rm -rf などの危険なコマンドは慎重に
次に読む: