2026年7月16日

2026年7月16日

シェルスクリプトの基本的な書き方

はじめに

シェルスクリプトはLinuxサーバー運用において自動化の出発点です。バックアップ、デプロイ、ログ整理、監視通知など、繰り返しの作業をスクリプト化することで作業時間を劇的に短縮できます。

複雑な処理にはPythonなどの言語が向きますが、コマンドを組み合わせるだけの作業ならシェルスクリプトが最速で、SSHログインしたらすぐ書けるという機動力も魅力です。

本記事では #!/usr/bin/env bash から始めて、変数、引数、条件分岐前の段階までを取り上げ、最初の1本を確実に書けるようにします。

症状・背景

シェルスクリプト が必要になる主な場面:

  • 定期バックアップなど自動化したい作業があるとき
  • 複数コマンドを一連の手順としてまとめたいとき
  • サーバー初期セットアップを再現可能にしたいとき
  • 監視やヘルスチェックを定型化したいとき

手順・設定方法

ステップ1: スクリプトの骨組み

#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'

# 説明: 〇〇するスクリプト
# 使い方: ./hello.sh NAME

echo "Hello, ${1:-World}!"
# 実行権限を付与
chmod +x hello.sh

# 実行
./hello.sh Linux

ステップ2: 変数と引数

#!/usr/bin/env bash
set -euo pipefail

# 変数の代入 (= の前後にスペースを入れない)
NAME="Linux"
COUNT=5

# 変数の参照は ${変数名}
echo "Name: ${NAME}, Count: ${COUNT}"

# 引数: $1, $2, ... / 全引数: "$@" / 個数: $#
echo "1番目の引数: $1"
echo "引数の数: $#"
echo "全引数: $@"

# デフォルト値
TARGET="${1:-default.txt}"

ステップ3: コマンド置換とリダイレクト

#!/usr/bin/env bash
set -euo pipefail

# コマンドの出力を変数に
TODAY=$(date +%Y-%m-%d)
USER_COUNT=$(who | wc -l)

echo "今日は ${TODAY}、ログイン中: ${USER_COUNT} 人"

# 標準出力をファイルへ
echo "log entry" > app.log         # 上書き
echo "log entry" >> app.log        # 追記

# 標準エラーも一緒に
command >> app.log 2>&1

# ヒアドキュメント (複数行)
cat << EOF > config.ini
[database]
host = localhost
port = 5432
EOF

ステップ4: 実用テンプレート

#!/usr/bin/env bash
#============================================
# backup.sh - データベースのバックアップを取得
# 使用法: ./backup.sh [DB名]
#============================================
set -euo pipefail
IFS=$'\n\t'

# 設定
readonly DB_NAME="${1:-myapp}"
readonly BACKUP_DIR="/backup"
readonly TIMESTAMP=$(date +%Y%m%d-%H%M%S)
readonly LOG_FILE="/var/log/backup.log"

# 処理開始
echo "[$(date)] start backup for ${DB_NAME}" | tee -a "${LOG_FILE}"

mkdir -p "${BACKUP_DIR}"
mysqldump "${DB_NAME}" | gzip > "${BACKUP_DIR}/${DB_NAME}-${TIMESTAMP}.sql.gz"

echo "[$(date)] backup completed" | tee -a "${LOG_FILE}"

注意事項

  • 先頭に set -euo pipefail を入れると、エラーで止まる・未定義変数を検出など安全性が大幅向上
  • = の前後にスペースを入れると構文エラーになります (A = 1 はNG、A=1 がOK)
  • 文字列は基本ダブルクォートで囲み、変数展開も ${VAR} 形式で書くと事故が減ります
  • スクリプトの拡張子は慣習で .sh、シバンで言語を明示することが本質的

まとめ

1. シバン: #!/usr/bin/env bash で実行シェル指定

2. 安全策: set -euo pipefail を冒頭に書く

3. 変数: = 前後にスペース禁止、参照は ${VAR}

4. 引数: $1, $@, $# で受け取り ${1:-default} で既定値

5. 記録: tee -a でログと画面に同時出力

関連記事:

お気軽にご相談ください

お見積りへ お問い合わせへ