サーバー運用やシステム管理の現場では、
“毎回同じ作業を手でやる” という非効率な時間が驚くほど多く存在します。
- ログの整理
- バックアップ
- サービス監視
- ファイル自動処理
- メール・Slack通知
これらを自動化してミスゼロ&効率最大化するために欠かせないのが
シェルスクリプトです。
しかし…
「毎回書き方を調べ直してしまう…」
「例外処理やログ出力まで手が回らない…」
「実務で使えるテンプレが欲しい!」
という声もよく聞きます。
そこで本記事では、
✨現場でそのまま使えるシェルスクリプトテンプレ集✨
を目的別に整理してまとめました。
スクリプトで仕事を自動化し、
あなたの大切な時間を取り戻しましょう!💡
それでは実務に役立つテンプレを順番に紹介していきます。
★印で囲まれた部分を書き換えるだけで簡単にスクリプトが作成できます。
コピペ&編集してあなた好みのスクリプトを作成しましょう!
ファイル存在チェック
#!/bin/bash
set -e
check_file() {
local file=”$1″
[[ -f “$file” ]] || { echo “ERROR: $file が存在しません” >&2; exit 1; }
}
check_file “★/etc/passwd★”
echo “ファイル存在OK!”
ディレクトリ存在チェック + 無ければ作成
#!/bin/bash
ensure_dir() {
local dir=”$1″
[[ -d “$dir” ]] || mkdir -p “$dir”
}
ensure_dir “★/tmp/myapp/logs★”
日付付きバックアップ
#!/bin/bash
backup_file() {
local file=”$1″
local dest=”${file}.$(date +%Y%m%d_%H%M%S).bak”
cp “$file” “$dest”
echo “Backup created: $dest”
}
backup_file “★/etc/passwd★”
一時ファイルの生成 + 終了時削除
#!/bin/bash
set -e
tmpfile=★$(mktemp)★
cleanup() {
rm -f “$tmpfile”
}
trap cleanup EXIT
echo “一時ファイル: $tmpfile”
拡張子を変更してコピー
!/bin/bash
change_extension() {
local src=”$1″
local newext=”$2″
local dest=”${src%.*}.$newext”
cp “$src” “$dest”
echo “変換: $src → $dest”
}
change_extension “★data.txt★” “★csv★”
大量ファイルの一括削除(find)
#!/bin/bash
TARGET_DIR=”★/var/log/myapp★”
find “$TARGET_DIR” -type f -name “★*.log★” -exec rm -f {} \;
用途:ログや作業ファイルの整理
注意:削除前確認 → -exec rm を外すだけで確認可能
古いログファイルの削除(一定日数前)
#!/bin/bash
LOG_DIR=”★/var/log/myapp★”
DAYS=★30★
find “$LOG_DIR” -type f -mtime +$DAYS -exec rm -f {} \;
-mtime +30 → 30日より古いファイルを削除
差分コピー(rsync:バックアップ)
#!/bin/bash
SRC=”★/src/data/★”
DEST=”★/backup/data/★”
rsync -av –delete “$SRC” “$DEST”
rsyncオプション | 意味 |
|---|---|
-a | パーミッション保持含むアーカイブ |
-v | 途中経過表示 |
--delete | 片方にないファイルを削除=完全同期 |
設定ファイルの文字置換(sed)
#!/bin/bash
sed -i ‘s/★oldhost★/★newhost★/g’ ★/etc/myapp/config.conf★
安全版(バックアップ付き)
#!/bin/bash
sed -i.bak ‘s/★oldhost★/★newhost★/g’ ★/etc/myapp/config.conf★
空ファイルを一括作成(seq + touch)
#!/bin/bash
for i in $(seq ★1 10★); do
touch “file_$i.txt”
done
用途:初期ファイル準備、テスト用
CPU/メモリ監視(top / free)
#!/bin/bash
LOG=”★/var/log/resource_monitor.log★”
echo “=== $(date) ===” >> “$LOG”
top -b -n1 | head -5 >> “$LOG”
free -h >> “$LOG”
echo >> “$LOG”
一括パッケージインストール
環境構築の自動化
#!/bin/bash
PACKAGES=”★curl vim git htop★”
for pkg in $PACKAGES; do
if ! rpm -q “$pkg” &>/dev/null; then
sudo yum install -y “$pkg”
fi
done
Debian/Ubuntu 版に置換:apt-get install
ログローテーション簡易版
#!/bin/bash
LOG=”★/var/log/myapp/app.log★”
if [ -f “$LOG” ]; then
mv “$LOG” “${LOG}$(date +%Y%m%d%H%M%S)”
fi
touch “$LOG”
アプリ死活監視(systemctl)
#!/bin/bash
SERVICE=”★nginx★”
if ! systemctl is-active –quiet “$SERVICE”; then
echo “$SERVICE is down. restarting…”
systemctl restart “$SERVICE”
fi
一括権限変更(find + chmod)
#!/bin/bash
DIR=”★/var/www/html★”
find “$DIR” -type f -exec chmod ★644★ {} \;
find “$DIR” -type d -exec chmod ★755★ {} \;
ログキーワード検出(grep)
#!/bin/bash
LOG=”★/var/log/messages★”
KEYWORD=”★ERROR★”
if grep -q “$KEYWORD” “$LOG”; then
echo “Error detected!”
fi
複数サーバーへまとめてSSH実行
#!/bin/bash
HOSTS=(★”server1″ “server2” “server3″★)
for h in “${HOSTS[@]}”; do
ssh “$h” “★uptime★”
done
ネットワーク疎通チェック(複数宛先)
#!/bin/bash
HOSTS=(★”8.8.8.8″ “1.1.1.1” “example.com”★)
for h in “${HOSTS[@]}”; do
ping -c 1 “$h” >/dev/null 2>&1 \
&& echo “$h OK” \
|| echo “$h NG”
done
特定文字列を含むファイル抽出
#!/bin/bash
DIR=”★/var/log★”
KEYWORD=”★ERROR★”
grep -rl “$KEYWORD” “$DIR”
ディレクトリ容量チェック
#!/bin/bash
DIR=”★/var/log★”
SIZE=$(du -sh “$DIR” | awk ‘{print $1}’)
echo “Directory $DIR size: $SIZE”
複数サーバーに同一ファイル配布
#!/bin/bash
SERVERS=(“server1” “server2”)
FILE=”/tmp/config.conf”
for s in “${SERVERS[@]}”; do
scp “$FILE” “$s:/etc/myapp/config.conf”
done

コメント