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

Bashスクリプトを使ってLinuxシステムの自動化を始めましょう。本記事では、Bashの基本構文から実践的な活用方法まで、段階的に学習できる完全ガイドを提供します。初心者でも30分で動くスクリプトを書けるようになる具体的な手順を解説します。


目次


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」のテキストファイルとして作成します。以下の手順で簡単なスクリプトを作成してみましょう。

  1. テキストエディタ(nano、vim、VS Codeなど)を開きます。
  2. 以下の内容を入力します。
#!/bin/bash

最初のBashスクリプト

echo "Hello, World!"

3. ファイルを保存します。ここでは「hello.sh」という名前で保存します。

スクリプトに実行権限を付与する

Bashスクリプトを実行するには、ファイルに実行権限を付与する必要があります。以下のコマンドを実行します。

chmod +x hello.sh

これで、スクリプトを実行できるようになります。

スクリプトの実行方法

スクリプトを実行する方法には、主に2通りあります。

  1. 直接実行(推奨)
./hello.sh

2. 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

このスクリプトでは、以下の処理を行っています。

  1. 移動元と移動先のディレクトリを指定
  2. 移動先ディレクトリが存在しない場合は作成
  3. 移動元ディレクトリ内の.txtファイルを検索
  4. 見つかったファイルを移動先に移動

また、ファイルのバックアップを作成するスクリプトも作成できます。

#!/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%"

このスクリプトでは、以下の処理を行っています。

  1. CPU使用率を取得
  2. 取得したCPU使用率が閾値を超えているかどうかを判定
  3. 閾値を超えていた場合は、メールでアラートを送信

また、ディスク使用率を監視するスクリプトも作成できます。

#!/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

このスクリプトでは、以下の処理を行っています。

  1. バックアップ対象のディレクトリとバックアップ先のディレクトリを指定
  2. バックアップファイル名にタイムスタンプを付与
  3. tarコマンドを使用して、ディレクトリを圧縮
  4. バックアップの成功・失敗を確認

また、リモートサーバーにバックアップを転送するスクリプトも作成できます。

#!/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スクリプトをデバッグモードで実行することで、スクリプトの実行過程を詳細に確認できます。デバッグモードを有効にするには、以下のいずれかの方法を使用します。

  1. スクリプトの先頭に「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

このスクリプトでは、以下の処理を行っています。

  1. trapコマンドを使用して、EXITシグナルを捕捉
  2. EXITシグナルが発生した際に、一時ファイルを削除し、メッセージを表示
  3. 一時ファイルを作成
  4. 何らかの処理を実行
  5. スクリプトを終了

これにより、スクリプトが正常に終了した場合でも、エラーが発生した場合でも、一時ファイルが確実に削除されます。

ログ出力の活用

スクリプトの実行過程を記録することで、デバッグやトラブルシューティングに役立てることができます。以下は、ログ出力を行うスクリプトの例です。

#!/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"

このスクリプトでは、以下の処理を行っています。

  1. ログファイルのパスを指定
  2. ログ出力関数を定義
  3. スクリプトの開始と終了を記録
  4. 処理の開始と終了を記録

ログファイルを確認することで、スクリプトの実行過程を詳細に把握できます。


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")"

スクリプトをテストする

スクリプトを作成したら、必ずテストを行ってください。テストを行うことで、バグやエラーを早期に発見し、修正することができます。テストケースとしては、以下のようなものが挙げられます。

  • 正常系のテスト(期待通りの動作をするか)
  • 異常系のテスト(エラーが発生した際に適切に処理されるか)
  • 境界値テスト(極端な値を入力した際に適切に処理されるか)
  • パフォーマンステスト(大量のデータを処理した際に適切に動作するか)

また、テストを

ABOUT ME
たから
サラリーマンをしながら開業して経営やってます。 今年、本業で独立・別事業を起業予定です。 ◆経験:IT講師/インフラエンジニア/PM/マネジメント/採用/運用・保守・構築・設計 ◆取得資格:CCNA/CCNP/LPIC-1/AZ-900/FE/サーティファイC言語 ◆サイドビジネス:アパレル事業/複数のWEBメディアを運営