導入
ここまでで、シェルスクリプトの基本はひととおり手に入りました。最後に、学んだ道具を1枚の地図にまとめ、この先どこへ進むかを確かめておきましょう。
説明
このコースで身につけたものを、書く順番どおりに並べるとこうなります。
#!/bin/bash
# 学んだ要素を1本にまとめた「型」
set -eu # 第7章: 失敗したら止める
# --- 設定 ---(第2章)
TARGET_DIR="${1:-/home/user/logs}" # 第7章: 既定値
TODAY=$(date +%Y-%m-%d) # 第2章: コマンド置換
# --- 部品 ---(第6章)
log() {
echo "[$TODAY] $1"
}
# --- 事前チェック ---(第4章)
if [ ! -d "$TARGET_DIR" ]; then
echo "エラー: $TARGET_DIR がありません" >&2
exit 1 # 第3章: 終了ステータス
fi
# --- 本体 ---(第5章)
log "集計を開始します"
total=0
for file in "$TARGET_DIR"/*.log; do
[ -f "$file" ] || continue # 第4章: 一致が無いときの守り
lines=$(wc -l < "$file")
log "$file: $lines 行"
total=$((total + lines)) # 第2章: 算術
done
log "合計 $total 行"
log "完了しました"
| 章 | 手に入れた道具 |
|---|---|
| 第1章 | スクリプトの作成・実行・シバン・実行権限 |
| 第2章 | 変数・クォート・$( )・$(( )) |
| 第3章 | 引数 $1 $#・リダイレクト・ヒアドキュメント・終了ステータス |
| 第4章 | if・test [ ]・ファイル判定・case |
| 第5章 | for・while・break/continue・while read |
| 第6章 | 関数・引数と戻り値・local・source |
| 第7章 | set -euo pipefail・クォートの徹底・trap・デバッグ |
| 第8章 | cron・crontab の書式・落とし穴・systemd タイマー |
| 第9章 | バックアップ・集計・監視の組み立て方 |
flowchart LR
A["手で打つ<br/>(Linuxコマンド)"] --> B["ファイルにまとめる<br/>(シェルスクリプト)"]
B --> C["条件と繰り返しで<br/>賢くする"]
C --> D["安全に書く<br/>set -e / trap"]
D --> E["cron で自動化"]
E --> F["運用に載せる<br/>ログ・監視・排他"]
次に進む道は、大きく3つあります。
- サーバー: 書いたスクリプトを動かす場所を知る。SSH・systemd・パッケージ管理・監視。
- Docker: スクリプトごと環境を持ち運ぶ。
DockerfileのRUNの中身は、結局シェルです。 - Git: スクリプトをバージョン管理する。crontab もファイルにして Git に入れるのが実務の作法でした。
そしてもう1つ。シェルスクリプトで書き続けないほうがいい場面も知っておいてください。数百行を超える、複雑なデータ構造を扱う、エラー処理が入り組む——そうなったら Python の出番です。「短く・単純に・コマンドをつなぐ」のがシェルの得意分野で、そこを外れたら別の道具に持ち替える。この判断ができるのも、実務の力量のうちです。
やってみよう
最後のスクリプトを実行して、学んだ要素が1本の中で協調して動くことを確かめましょう。次に sh script.sh /home/user/files として、引数で対象を切り替えてみてください(.log が無いので件数は0になります)。うまく動かないときは sh -x script.sh でトレースを取る——第7章で学んだデバッグの出番です。
演習
引数なしでスクリプトを実行し、logs ディレクトリの集計を完了させてください(合計 18 行 と出ます)。
ヒント1を見る
「▶ 実行」ボタン、または端末で sh script.sh。
ヒント2を見る
logs には access.log(10行)と app.log(8行)があります。