〜毎回同じコマンドを5回打っていたら、先輩に「それ1つのファイルにまとめときなよ」と言われた話〜
こんにちは!ハンズオンラボ運営のえむです。
サーバーにログインするたびに、「ディレクトリを移動して、ログを確認して、プロセスを確認して……」と、同じコマンドを何度も手入力していませんか?
この記事では、この繰り返し作業をまとめて自動化するシェルスクリプトを、「繰り返し作業のマクロ」 というたとえで解説します。
この記事を読むと、以下のことができるようになります
- シェルスクリプトがどんな課題を解決する仕組みなのか説明できる
- 実際に動くシェルスクリプトを書いて実行できる
- 変数・条件分岐・繰り返しといった基本の書き方がわかる
シェルスクリプトとは何か——「繰り返し作業のマクロ」
Excelで、毎回同じ手順(セルをコピーして、別シートに貼り付けて、合計を計算する)を繰り返しているとき、「マクロ」を組んでボタン1つで全部の手順を実行できるようにすることがあります。
シェルスクリプトは、このLinuxコマンド版のマクロです。ターミナルで打つコマンドを順番にファイルに書いておき、そのファイルを実行するだけで、一連のコマンドをまとめて自動実行できます。
- Excelのマクロボタン → シェルスクリプトの実行コマンド
- 記録された操作手順 → ファイルに書かれたコマンドの羅列
- ボタンを押すだけで完了 →
bash script.shを実行するだけで完了
最初のシェルスクリプトを書いてみる
「今日の日付を表示して、ディスクの空き容量を確認する」という2つの作業をまとめたスクリプトを作ります。
#!/bin/bash
# check_status.sh
echo "===== 本日のステータス確認 ====="
echo "現在の日時:$(date)"
echo ""
echo "===== ディスクの空き容量 ====="
df -h
# 実行権限を付与する
chmod +x check_status.sh
# 実行する
./check_status.sh
実行結果:
===== 本日のステータス確認 =====
現在の日時:2026年7月7日 火曜日 10:30:00 JST
===== ディスクの空き容量 =====
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 20G 28G 42% /
1行目の#!/bin/bashは**シバン(shebang)**と呼ばれ、「このファイルはbashというシェルで実行してください」という宣言です。マクロで言えば「このボタンはExcelマクロとして実行してください」という指定に相当します。
変数:毎回書き換えていた値を1箇所にまとめる
シェルスクリプトでも、プログラミング同様に変数を使えます。
#!/bin/bash
LOG_DIR="/var/log/myapp"
BACKUP_DIR="/home/user/backups"
TODAY=$(date +%Y%m%d)
echo "ログディレクトリ: $LOG_DIR"
echo "バックアップ先: $BACKUP_DIR/backup_$TODAY.tar.gz"
tar -czf "$BACKUP_DIR/backup_$TODAY.tar.gz" "$LOG_DIR"
「フォルダのパスを変更したくなったら、LOG_DIRの1行を書き換えるだけで済む」――これはマクロで「参照するセル番地を1箇所変えれば、全体の計算が追従する」のと同じ考え方です。同じ値をスクリプト内に何度もベタ書きしていると、変更のたびに全箇所を探して直す羽目になります。
条件分岐:状況によって処理を変える
#!/bin/bash
USAGE=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')
if [ "$USAGE" -gt 80 ]; then
echo "警告:ディスク使用率が${USAGE}%です。空き容量を確認してください"
else
echo "ディスク使用率は${USAGE}%です。問題ありません"
fi
「もし〇〇だったら、こうする」という判断を人間が毎回目視で行う代わりに、スクリプトに判断基準を書いておくことで、確認作業そのものを自動化できます。
繰り返し処理:同じ作業を複数回自動で行う
#!/bin/bash
# 複数のサーバーに順番にpingを送って生存確認する
SERVERS=("web1.example.com" "web2.example.com" "db1.example.com")
for server in "${SERVERS[@]}"; do
if ping -c 1 "$server" > /dev/null 2>&1; then
echo "$server : 生存確認OK"
else
echo "$server : 応答なし!"
fi
done
実行結果:
web1.example.com : 生存確認OK
web2.example.com : 生存確認OK
db1.example.com : 応答なし!
3台のサーバーを1台ずつ手動でpingするのではなく、リストにまとめて一括で確認できます。サーバーが10台、100台と増えても、SERVERSのリストに追加するだけでスクリプト自体は変更不要です。
シェルスクリプトが活躍する典型的な場面
以前の記事で紹介したcronと組み合わせることで、「毎日決まった時刻にこのシェルスクリプトを実行する」という自動化も簡単に実現できます。「マクロを作る」だけでなく「マクロを決まった時間に自動で起動する」ところまでセットにすると、日々の運用作業がぐっと省力化されます。
実務で差がつくポイント:エラーで止まる設計にする
マクロが「途中のセルが空欄でもそのまま最後まで実行してしまう」と、気づかないうちに間違った集計結果が出来上がってしまいます。シェルスクリプトも同様に、何も対策しないと、途中のコマンドが失敗しても構わず次に進んでしまいます。
#!/bin/bash
set -e # コマンドが失敗したら、その時点でスクリプトを停止する
cd /path/to/important/directory
rm -rf ./old_files/*
echo "古いファイルを削除しました"
set -eを先頭に書いておくことで、たとえばcdが失敗した(ディレクトリが存在しない)場合に、間違った場所でrm -rfが実行されてしまう事故を未然に防げます。「途中で何かおかしくなったら、そこで一旦止まって確認する」という、慎重なマクロ設計の基本です。
ポイント:処理のまとまりは関数化する
スクリプトが長くなってきたら、Excelマクロで「処理をサブルーチンに分割する」のと同じように、関数として処理をまとめると読みやすくなります。
#!/bin/bash
check_disk_usage() {
local usage=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')
echo "ディスク使用率:${usage}%"
}
check_memory_usage() {
free -h | grep Mem
}
echo "===== システムチェック開始 ====="
check_disk_usage
check_memory_usage
echo "===== システムチェック完了 ====="
処理のまとまりに名前がついていると、後から読んだときに「何をしている部分か」が一目でわかり、修正すべき箇所も見つけやすくなります。
よくある勘違い:シェルスクリプトは「コマンドの丸暗記」がいらなくなるわけではない
「シェルスクリプトを覚えれば、個々のLinuxコマンドを覚えなくてもよくなる」と思われがちですが、実際は逆です。シェルスクリプトは普段使っているコマンドを組み合わせて自動化する仕組みなので、素材となる個々のコマンド(ls、grep、awkなど)の理解があるほど、より高度なスクリプトが書けるようになります。マクロを作るにも、Excelの基本操作を理解していないと組めないのと同じです。
ビフォーアフター
【ビフォー】
- 定型作業 → 「毎回同じコマンドを手入力する」
- 複数サーバーの確認 → 「1台ずつ手作業でログインして確認する」
- 設定値の変更 → 「スクリプトのあちこちを探して書き換える」
【アフター】
- 定型作業 → 「シェルスクリプトにまとめて、実行コマンド1つで完了させる」
- 複数サーバーの確認 → 「for文でリストをまとめて処理する」
- 設定値の変更 → 「変数を1箇所書き換えるだけで全体に反映される」
まとめ
この記事では、シェルスクリプトの基本的な考え方を整理しました。
- シェルスクリプトは「繰り返し作業のマクロ」のように、コマンドをまとめて自動実行する仕組み
- 変数を使うことで、値の変更を1箇所にまとめられる
- 条件分岐(if)で「状況によって処理を変える」判断を自動化できる
- 繰り返し処理(for)で複数のサーバーやファイルへの一括操作ができる
- cronと組み合わせることで、定型作業を決まった時刻に自動実行できる
毎回同じコマンドを手入力している作業があれば、今日からシェルスクリプトにまとめてみてください。
ハンズオンラボでは、未経験からでも「作って覚える」をモットーにしたITハンズオンイベントを定期開催しています。
面白かったら
「👇いいね」で応援

