Bashスクリプト入門完全ガイド【2026年版】

Bashスクリプト入門完全ガイド【2026年版】
Bashスクリプトを使ってLinuxシステムの自動化を始めましょう。本記事では、Bashの基本構文から実践的な活用方法まで、段階的に学習できる完全ガイドを提供します。初心者でも30分で動くスクリプトを書けるようになる具体的な手順を解説します。
目次
- Bashスクリプトとは何か
- Bashスクリプトを書く環境を整える
- Bashの基本構文をマスターする
- 実践的なBashスクリプト例
- Bashスクリプトのデバッグ方法
- Bashスクリプトのベストプラクティス
- よくある間違いとその回避方法
- Bashスクリプトに関するFAQ
- まとめ
Bashスクリプトとは何か
Bashスクリプトは、Linux/Unixシステムで動作するシェルスクリプトの一種です。コマンドライン上で実行できるコマンドをテキストファイルにまとめ、自動化やバッチ処理に活用します。例えば、毎日決まった時間にデータのバックアップを取るスクリプトや、ログファイルの整理を自動化するスクリプトなどが挙げられます。
Bashスクリプトの最大のメリットは、手動で行っていた作業を自動化できる点です。これにより、作業時間の短縮だけでなく、ヒューマンエラーの防止にもつながります。特に、システム管理者やDevOpsエンジニアにとっては必須のスキルとなっています。
Bashスクリプトは、以下のような場面で活用されています。
- システムの監視とログ管理
- 定期的なバックアップ処理
- ファイルやディレクトリの一括操作
- ネットワーク設定の自動化
- アプリケーションのデプロイメント
Bashスクリプトを習得することで、日々の作業効率を大幅に向上させることができます。
Bashスクリプトを書く環境を整える
Bashのインストールと確認
多くのLinuxディストリビューションやmacOSでは、Bashがデフォルトでインストールされています。以下のコマンドでBashのバージョンを確認できます。
bash --version例えば、Ubuntu 22.04 LTSでは以下のような出力が得られます。
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
Bash 5.x系が推奨されますが、4.x系でも多くの機能を利用できます。Windows環境では、WSL(Windows Subsystem for Linux)を利用してBashを実行できます。
スクリプトファイルの作成
Bashスクリプトは、拡張子「.sh」のテキストファイルとして作成します。以下の手順で簡単なスクリプトを作成してみましょう。
- テキストエディタ(nano、vim、VS Codeなど)を開きます。
- 以下の内容を入力します。
#!/bin/bash
最初のBashスクリプト
echo "Hello, World!"
3. ファイルを保存します。ここでは「hello.sh」という名前で保存します。
スクリプトに実行権限を付与する
Bashスクリプトを実行するには、ファイルに実行権限を付与する必要があります。以下のコマンドを実行します。
chmod +x hello.shこれで、スクリプトを実行できるようになります。
スクリプトの実行方法
スクリプトを実行する方法には、主に2通りあります。
- 直接実行(推奨)
./hello.sh2. Bashインタプリタで実行
bash hello.sh直接実行する場合は、スクリプトの先頭に「#!/bin/bash」という shebang(シバン)行を記述する必要があります。これにより、OSがどのインタプリタを使用するかを認識します。
開発環境の整備
Bashスクリプトの開発効率を上げるために、以下のツールを活用しましょう。
| ツール | 用途 | 導入方法 |
|---|---|---|
| VS Code | スクリプトの編集とデバッグ | 公式サイトからダウンロード |
| ShellCheck | 静的解析ツール(構文エラーの検出) | sudo apt install shellcheck(Ubuntu/Debian) |
| Bash Debugger | スクリプトのデバッグ | sudo apt install bashdb(Ubuntu/Debian) |
VS Codeを使用すると、構文ハイライトや自動補完機能により、効率的にスクリプトを作成できます。また、ShellCheckを導入することで、一般的な間違いを事前に検出できます。
Bashの基本構文をマスターする
変数の使い方
Bashスクリプトでは、変数を使用してデータを保存します。変数の宣言と代入は以下のように行います。
# 変数の宣言と代入
NAME="Alice"
AGE=30
変数の参照($を付ける)
echo "Name: $NAME, Age: $AGE"
変数名には大文字と小文字が区別され、アンダースコア(_)を使用できます。また、変数に代入する値が空白を含む場合は、ダブルクォーテーションで囲む必要があります。
MESSAGE="Hello, World!"
echo "$MESSAGE"
変数の値を変更することもできます。
COUNT=1
COUNT=$((COUNT + 1))
echo "Count: $COUNT"
Bashでは、変数のスコープはデフォルトでグローバルです。ローカル変数を使用するには、関数内で「local」キーワードを使用します。
function example {
local LOCAL_VAR="I'm local"
echo "$LOCAL_VAR"
}
条件分岐(if文)
Bashスクリプトでは、if文を使用して条件分岐を行います。基本的な構文は以下の通りです。
if [ 条件 ]; then
# 条件が真の場合の処理
elif [ 別の条件 ]; then
# 別の条件が真の場合の処理
else
# いずれの条件も真でない場合の処理
fi
条件式には、以下のような比較演算子を使用します。
| 演算子 | 説明 | 使用例 |
|---|---|---|
| -eq | 等しい | [ “$A” -eq “$B” ] |
| -ne | 等しくない | [ “$A” -ne “$B” ] |
| -lt | より小さい | [ “$A” -lt “$B” ] |
| -le | 以下 | [ “$A” -le “$B” ] |
| -gt | より大きい | [ “$A” -gt “$B” ] |
| -ge | 以上 | [ “$A” -ge “$B” ] |
| = | 文字列が等しい | [ “$A” = “$B” ] |
| != | 文字列が等しくない | [ “$A” != “$B” ] |
| -z | 文字列が空 | [ -z “$A” ] |
| -n | 文字列が空でない | [ -n “$A” ] |
以下は、if文を使用した具体的な例です。
#!/bin/bash
AGE=25
if [ "$AGE" -ge 18 ]; then
echo "あなたは成人です。"
else
echo "あなたは未成年です。"
fi
また、ファイルの存在を確認する場合は、以下のように記述します。
FILE="/path/to/file"
if [ -f "$FILE" ]; then
echo "ファイルが存在します。"
else
echo "ファイルが存在しません。"
fi
繰り返し処理(for・while)
Bashスクリプトでは、forループとwhileループを使用して繰り返し処理を行います。
forループ
forループは、リストや範囲内の要素を順に処理します。基本的な構文は以下の通りです。
for 変数 in リスト; do
# 処理
done
例えば、1から5までの数値を出力するスクリプトは以下のようになります。
#!/bin/bash
for i in {1..5}; do
echo "Number: $i"
done
また、配列の要素を処理することもできます。
#!/bin/bash
FRUITS=("Apple" "Banana" "Orange")
for fruit in "${FRUITS[@]}"; do
echo "Fruit: $fruit"
done
whileループ
whileループは、条件が真である間、処理を繰り返します。基本的な構文は以下の通りです。
while [ 条件 ]; do
# 処理
done
例えば、1から5までの数値を出力するwhileループは以下のようになります。
#!/bin/bash
i=1
while [ $i -le 5 ]; do
echo "Number: $i"
i=$((i + 1))
done
また、ユーザーからの入力を待つスクリプトも作成できます。
#!/bin/bash
echo "Enter 'quit' to exit."
read INPUT
while [ "$INPUT" != "quit" ]; do
echo "You entered: $INPUT"
read INPUT
done
関数の定義と呼び出し
Bashスクリプトでは、関数を使用してコードの再利用性を高めることができます。関数の定義と呼び出しは以下のように行います。
# 関数の定義
function 関数名 {
# 処理
}
または
関数名() {
# 処理
}
関数の呼び出し
関数名
例えば、挨拶を表示する関数を定義してみましょう。
#!/bin/bash
greet() {
echo "Hello, $1!"
}
関数の呼び出し
greet "Alice"
greet "Bob"
関数に引数を渡すこともできます。Bashでは、引数は位置パラメータ($1, $2, …)として参照されます。また、$@や$*を使用してすべての引数を参照できます。
以下は、引数を受け取る関数の例です。
#!/bin/bash
sum() {
local total=0
for num in "$@"; do
total=$((total + num))
done
echo "Sum: $total"
}
sum 1 2 3 4 5
関数内で使用される変数は、デフォルトでグローバルスコープです。ローカル変数を使用するには、localキーワードを使用します。
実践的なBashスクリプト例
ファイル操作の自動化
Bashスクリプトを使用して、ファイル操作を自動化する方法を紹介します。例えば、特定の拡張子を持つファイルを別のディレクトリに移動するスクリプトを作成してみましょう。
#!/bin/bash
移動元と移動先のディレクトリを指定
SOURCE_DIR="/path/to/source"
DEST_DIR="/path/to/destination"
移動先ディレクトリが存在しない場合は作成
mkdir -p "$DEST_DIR"
.txtファイルを移動
for file in "$SOURCE_DIR"/*.txt; do
if [ -f "$file" ]; then
mv "$file" "$DEST_DIR/"
echo "Moved: $file"
fi
done
このスクリプトでは、以下の処理を行っています。
- 移動元と移動先のディレクトリを指定
- 移動先ディレクトリが存在しない場合は作成
- 移動元ディレクトリ内の.txtファイルを検索
- 見つかったファイルを移動先に移動
また、ファイルのバックアップを作成するスクリプトも作成できます。
#!/bin/bash
バックアップ対象のファイル
FILE="/path/to/important/file.txt"
バックアップ先のディレクトリ
BACKUP_DIR="/path/to/backups"
バックアップファイル名(タイムスタンプ付き)
BACKUP_FILE="$BACKUP_DIR/file_$(date +%Y%m%d_%H%M%S).txt"
バックアップの実行
cp "$FILE" "$BACKUP_FILE"
echo "Backup created: $BACKUP_FILE"
システム監視スクリプト
Bashスクリプトを使用して、システムの監視を行うこともできます。例えば、CPU使用率が一定の閾値を超えた場合にアラートを送信するスクリプトを作成してみましょう。
#!/bin/bash
閾値(パーセント)
THRESHOLD=90
CPU使用率を取得
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
CPU使用率が閾値を超えた場合にアラートを送信
if (( $(echo "$CPU_USAGE > $THRESHOLD" | bc -l) )); then
echo "ALERT: High CPU usage detected ($CPU_USAGE%)" | mail -s "CPU Alert" admin@example.com
fi
echo "Current CPU usage: $CPU_USAGE%"
このスクリプトでは、以下の処理を行っています。
- CPU使用率を取得
- 取得したCPU使用率が閾値を超えているかどうかを判定
- 閾値を超えていた場合は、メールでアラートを送信
また、ディスク使用率を監視するスクリプトも作成できます。
#!/bin/bash
監視対象のディレクトリ
DIR="/"
閾値(パーセント)
THRESHOLD=80
ディスク使用率を取得
DISK_USAGE=$(df -h "$DIR" | awk 'NR==2 {print $5}' | tr -d '%')
ディスク使用率が閾値を超えた場合にアラートを送信
if [ "$DISK_USAGE" -gt "$THRESHOLD" ]; then
echo "ALERT: High disk usage detected ($DISK_USAGE%) on $DIR" | mail -s "Disk Alert" admin@example.com
fi
echo "Current disk usage: $DISK_USAGE% on $DIR"
バックアップスクリプト
Bashスクリプトを使用して、定期的なバックアップ処理を自動化することもできます。例えば、ホームディレクトリのバックアップを作成するスクリプトを作成してみましょう。
#!/bin/bash
バックアップ対象のディレクトリ
SOURCE_DIR="$HOME"
バックアップ先のディレクトリ
BACKUP_DIR="/mnt/backups"
バックアップファイル名(タイムスタンプ付き)
BACKUP_FILE="$BACKUP_DIR/home_backup_$(date +%Y%m%d_%H%M%S).tar.gz"
バックアップの実行
tar -czf "$BACKUP_FILE" -C "$(dirname "$SOURCE_DIR")" "$(basename "$SOURCE_DIR")"
バックアップの成功を確認
if [ $? -eq 0 ]; then
echo "Backup created successfully: $BACKUP_FILE"
else
echo "Backup failed"
exit 1
fi
このスクリプトでは、以下の処理を行っています。
- バックアップ対象のディレクトリとバックアップ先のディレクトリを指定
- バックアップファイル名にタイムスタンプを付与
- tarコマンドを使用して、ディレクトリを圧縮
- バックアップの成功・失敗を確認
また、リモートサーバーにバックアップを転送するスクリプトも作成できます。
#!/bin/bash
バックアップ対象のファイル
SOURCE_FILE="/path/to/backup.tar.gz"
リモートサーバーの情報
REMOTE_USER="user"
REMOTE_HOST="remote.example.com"
REMOTE_DIR="/path/to/backups"
バックアップの転送
scp "$SOURCE_FILE" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR"
転送の成功を確認
if [ $? -eq 0 ]; then
echo "Backup transferred successfully to $REMOTE_HOST:$REMOTE_DIR"
else
echo "Backup transfer failed"
exit 1
fi
Bashスクリプトのデバッグ方法
Bashスクリプトのデバッグは、エラーの原因を特定し、修正するために重要な作業です。以下に、効果的なデバッグ方法を紹介します。
デバッグモードの有効化
Bashスクリプトをデバッグモードで実行することで、スクリプトの実行過程を詳細に確認できます。デバッグモードを有効にするには、以下のいずれかの方法を使用します。
- スクリプトの先頭に「set -x」を追加
#!/bin/bash
set -x
echo "Hello, World!"
2. コマンドラインから「-x」オプションを指定して実行
bash -x script.shデバッグモードを有効にすると、スクリプトの各行が実行される前に出力されます。これにより、どの行でエラーが発生したかを特定しやすくなります。
ShellCheckの活用
ShellCheckは、Bashスクリプトの静的解析を行うツールです。一般的な間違いやベストプラクティスに反する箇所を検出してくれます。
ShellCheckをインストールするには、以下のコマンドを実行します。
sudo apt install shellcheck # Ubuntu/Debian
brew install shellcheck # macOS
ShellCheckを使用してスクリプトを解析するには、以下のコマンドを実行します。
shellcheck script.sh例えば、以下のスクリプトを解析してみましょう。
#!/bin/bash
if [ $1 = "hello" ]
then
echo "Hello, World!"
fi
ShellCheckを実行すると、以下のような警告が表示されます。
In script.sh line 3:
if [ $1 = "hello" ]
^-- SC2086: Double quote to prevent globbing and word splitting.
この警告は、変数$1をダブルクォーテーションで囲むことを推奨しています。修正後のスクリプトは以下の通りです。
#!/bin/bash
if [ "$1" = "hello" ]
then
echo "Hello, World!"
fi
trapコマンドの活用
trapコマンドを使用すると、スクリプトの実行中に発生したシグナルやエラーを捕捉し、特定の処理を行うことができます。例えば、スクリプトが終了した際に一時ファイルを削除する処理を行うことができます。
#!/bin/bash
一時ファイル
TEMP_FILE="/tmp/tempfile"
trapコマンドの設定
trap 'rm -f "$TEMP_FILE"; echo "Cleanup done"' EXIT
一時ファイルの作成
touch "$TEMP_FILE"
何らかの処理
echo "Processing..."
スクリプトの終了
exit 0
このスクリプトでは、以下の処理を行っています。
- trapコマンドを使用して、EXITシグナルを捕捉
- EXITシグナルが発生した際に、一時ファイルを削除し、メッセージを表示
- 一時ファイルを作成
- 何らかの処理を実行
- スクリプトを終了
これにより、スクリプトが正常に終了した場合でも、エラーが発生した場合でも、一時ファイルが確実に削除されます。
ログ出力の活用
スクリプトの実行過程を記録することで、デバッグやトラブルシューティングに役立てることができます。以下は、ログ出力を行うスクリプトの例です。
#!/bin/bash
ログファイル
LOG_FILE="/var/log/myscript.log"
ログ出力関数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}
ログの初期化
log "Script started"
何らかの処理
log "Processing started"
sleep 2
log "Processing completed"
ログの終了
log "Script completed"
このスクリプトでは、以下の処理を行っています。
- ログファイルのパスを指定
- ログ出力関数を定義
- スクリプトの開始と終了を記録
- 処理の開始と終了を記録
ログファイルを確認することで、スクリプトの実行過程を詳細に把握できます。
Bashスクリプトのベストプラクティス
Bashスクリプトを開発する際には、以下のベストプラクティスを参考にしてください。これにより、保守性や信頼性の高いスクリプトを作成することができます。
Shebangを明記する
スクリプトの先頭には、必ずShebang行を記述してください。これにより、OSがどのインタプリタを使用するかを明確に指定できます。
#!/bin/bash
Shebang行を記述することで、スクリプトを直接実行する際に、正しいインタプリタが使用されます。
変数をダブルクォーテーションで囲む
変数を参照する際には、必ずダブルクォーテーションで囲んでください。これにより、変数に空白が含まれていた場合でも、正しく処理されます。
# 良い例
echo "$VARIABLE"
悪い例
echo $VARIABLE
長いオプションを使用する
コマンドオプションは、短い形式ではなく、長い形式を使用してください。これにより、スクリプトの可読性が向上します。
# 良い例
rm --recursive --force directory
悪い例
rm -rf directory
エラーハンドリングを行う
スクリプト内でエラーが発生した際には、適切なエラーハンドリングを行ってください。例えば、コマンドが失敗した場合にスクリプトを終了するように設定します。
#!/bin/bash
set -e # コマンドが失敗した場合にスクリプトを終了
何らかの処理
rm file.txt
また、エラーメッセージを表示することで、デバッグが容易になります。
#!/bin/bash
エラーハンドリング関数
error_exit() {
echo "$1" 1>&2
exit 1
}
何らかの処理
if ! command; then
error_exit "Command failed"
fi
関数を活用する
繰り返し使用される処理は、関数として定義してください。これにより、コードの再利用性が向上し、保守性が高まります。
#!/bin/bash
関数の定義
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}
関数の呼び出し
log "Script started"
log "Processing started"
ハードコーディングを避ける
スクリプト内に直接値を埋め込む(ハードコーディング)のではなく、変数や環境変数を使用してください。これにより、スクリプトの柔軟性が向上します。
# 良い例
CONFIG_FILE="/etc/myapp/config.conf"
悪い例
CONFIG_FILE="/home/user/config.conf"
スクリプトを文書化する
スクリプト内にコメントを記述し、スクリプトの目的や使用方法を文書化してください。また、ヘッダ部分にスクリプトの概要や作成者、作成日などを記述しておくと良いでしょう。
#!/bin/bash
#
バックアップスクリプト
#
作成者: あなたの名前
作成日: 2026-01-01
説明: ホームディレクトリのバックアップを作成します
変数の定義
SOURCE_DIR="$HOME"
BACKUP_DIR="/mnt/backups"
バックアップの実行
tar -czf "$BACKUP_DIR/home_backup_$(date +%Y%m%d_%H%M%S).tar.gz" -C "$(dirname "$SOURCE_DIR")" "$(basename "$SOURCE_DIR")"
スクリプトをテストする
スクリプトを作成したら、必ずテストを行ってください。テストを行うことで、バグやエラーを早期に発見し、修正することができます。テストケースとしては、以下のようなものが挙げられます。
- 正常系のテスト(期待通りの動作をするか)
- 異常系のテスト(エラーが発生した際に適切に処理されるか)
- 境界値テスト(極端な値を入力した際に適切に処理されるか)
- パフォーマンステスト(大量のデータを処理した際に適切に動作するか)
また、テストを




