はじめてのシェルスクリプト入門|日常作業を自動化する基本構文と実例解説
シェルスクリプトを使えば、バックアップやログ整理などの面倒な作業を自動化できます。この記事では初心者にもわかりやすく、基本構文から実践的な例まで丁寧に解説します。
シェルスクリプトとは|日常作業自動化のメリット
シェルスクリプトは、複数のシェルコマンドをまとめて実行するプログラムで、拡張子は一般的に .sh
を使います。bash や sh といったシェル環境で動作し、日々のバックアップやログ整理などの定型作業を自動化できます。
手作業のミスを減らし、作業時間を短縮できるうえ、スクリプト化によって処理の再現性が高まります。チームで共有すれば運用の均質化にも役立ち、多人数環境でも安定運用が可能です。
シェバン(#!/bin/bash)の基本と役割
スクリプト先頭の「#!」はシェバンと呼ばれ、後続に記述したシェルを使ってスクリプトを解釈します。
bash を指定する場合は #!/bin/bash
が基本ですが、環境によってパスが異なることもあります。その際は #!/usr/bin/env bash
と記述すると、環境変数 PATH に従って最適な bash を検索します。実行権限付与後に ./script.sh
で呼び出す場合、この行が正しく作用します。
変数の宣言と利用方法|データを扱う
変数は NAME=value
の形式で宣言し、展開時は $NAME
または ${NAME}
を使います。宣言時に「=
の前後にスペースを入れるとエラーになる」点に注意しましょう。
コマンドの実行結果を変数化する場合は RESULT=$(command)
のように書きます。${NAME} を使うと、変数名の直後に文字列が続く場合でも正確に展開できます。
引数の基本操作|コマンドライン入力を活用
スクリプトに外部引数を渡すには位置パラメータ $1
~$9
を利用します。$0
はスクリプト名自体を表し、$#
で引数の総数を取得できます。
全引数を扱う $@
と $*
は似ていますが、ダブルクォートで囲んだ場合に挙動が異なるため、"$@"
が推奨されます。shift
で引数を順次シフトする方法も覚えておくと便利です。
条件分岐(if文)による処理分岐
条件分岐は if
~fi
で記述します。POSIX互換の単一括弧 [ ]
と bash拡張の二重括弧 [[ ]]
があり、後者では論理演算子 &&
、||
やパターンマッチが利用可能です。
数値比較(-eq
)、文字列比較(==
)、ファイル判定(-f
:通常ファイル、-d
:ディレクトリなど)を組み合わせると柔軟な分岐が実現します。
ループ構文(for, while)で繰り返し処理
for
や while
を使って繰り返し処理を実装します。リスト処理は for file in *.log; do …; done
、条件ループは while [ 条件 ]; do …; done
です。
また、数値ループでは for ((i=1; i<=10; i++)); do
が使えます。ファイル読み込みには while IFS= read -r line; do …; done < input.txt
のように記述すると、空白やバックスラッシュを含む行でも安全に処理できます。
-r
を指定することでエスケープ処理を無効化し、意図しない変換を防げます。
実践例:バックアップ自動化スクリプト
ホームディレクトリを日付付きでアーカイブする例です。#!/usr/bin/env bash
BACKUP_DIR=/backup
TARGET_DIR=/home/user
mkdir -p "$BACKUP_DIR" || { echo "ディレクトリ作成失敗"; exit 1; }
DATE=$(date +%Y%m%d)
tar -czf "$BACKUP_DIR/home_$DATE.tar.gz" "$TARGET_DIR"
エラー処理を加えることでトラブル発生時の原因追跡が容易になります。cron に登録して定期実行すれば、バックアップの自動化とローテーション管理が両立します。
実践例:ログ整理(古いログの削除)
7日以上前のログを削除する例です。#!/bin/bash
LOG_DIR=/var/log/myapp
echo "削除対象一覧:"
find "$LOG_DIR" -type f -mtime +7 -name "*.log" -ls
# 削除実行
find "$LOG_DIR" -type f -mtime +7 -name "*.log" -delete-ls
で対象を事前確認し、-delete
オプションで安全に削除できます。-exec rm
を使う場合は、削除前後にログを残す工夫が望ましいです。
スクリプトの実行権限と運用ポイント
スクリプトには chmod +x script.sh
で実行権限を設定し、cron で定期実行する際はリダイレクトでログを保存します。
例:0 2 * * * /path/script.sh >> /var/log/script.log 2>&1
。
スクリプト冒頭にはコメントで目的や使用方法を記載し、set -e
(エラー時停止)や set -x
(デバッグ出力)を利用すると運用性が向上します。
ただし、set -e
はパイプラインやサブシェル内では効かないことがあります。複雑な処理を行う場合は、明示的なエラーチェック(例:command || exit 1
)も併用すると安全です。
まとめ|学習リソースと次のステップ
今回の基礎構文を押さえれば、バックアップやログ整理などの日常タスクを効率化できます。さらに cron
や外部ツール連携を学ぶと、自動化の幅が広がります。
以下のリファレンスが参考になりますので、ぜひ目を通してみてください。
参考1:GNU Bash Reference Manual
参考2:crontab マニュアル
▼関連記事:ステップアップしたい方はこちら