Bashスクリプト入門【2026年6月更新】

Bashスクリプトを使いこなせば、日々の作業を自動化し、システム管理の効率を劇的に向上させられます。Linuxサーバーやクラウド環境で繰り返し実行するコマンドを1つのスクリプトにまとめることで、人的ミスを減らし、作業時間を最大90%短縮できます。本記事では、Bashスクリプトの基本から実践的なテクニックまで、具体的なサンプルコードと共に解説します。初心者でも理解できるように、段階的に学習できる構成となっており、すぐに実務で活用できる内容です。


目次


Bashスクリプトとは何か

Bashスクリプトは、Linux/Unix系システムで動作するシェルスクリプトの一種で、コマンドライン操作を自動化するためのプログラミング言語です。Bash(Bourne-Again SHell)は、Unixシェルの一種であり、コマンドの実行、ファイル操作、プロセス管理など、システム管理に必要な機能を提供します。

Bashスクリプトの主な特徴は以下の通りです。

  • 軽量で高速:専用のインタープリタで動作するため、PythonやPerlと比較して起動が速い
  • システムとの親和性が高い:Linux/Unixのコマンドラインと直接連携可能
  • 学習コストが低い:基本的な構文は数時間で習得できる
  • 自動化に最適:定型業務の繰り返し実行を効率化

例えば、毎朝実行するログファイルのバックアップや、サーバーのステータス監視などを自動化できます。以下は、簡単なBashスクリプトの例です。

#!/bin/bash

現在時刻を取得してログに記録

current_time=$(date +"%Y-%m-%d %H:%M:%S") echo "[$current_time] バックアップを開始します" >> /var/log/backup.log

バックアップ処理

tar -czf /backup/data_$(date +%Y%m%d).tar.gz /home/user/data

処理完了を記録

echo "[$(date +"%Y-%m-%d %H:%M:%S")] バックアップが完了しました" >> /var/log/backup.log

このスクリプトを実行すると、現在時刻と共にバックアップ処理の開始・終了がログファイルに記録されます。このように、Bashスクリプトはシステム管理の定型業務を自動化する強力なツールです。


実行環境のセットアップ

Bashスクリプトを実行するには、LinuxまたはmacOSの環境が必要です。Windows環境では、WSL(Windows Subsystem for Linux)を使用するか、Git Bashなどのターミナルエミュレータを利用します。

Linux環境の準備

ほとんどのLinuxディストリビューションにはBashが標準でインストールされています。以下のコマンドでバージョンを確認できます。

$ bash --version
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)

Bashのバージョンは5系以上を推奨します。古いバージョン(3系以下)では、一部の機能が動作しない場合があります。

WSLを使用したWindo…

Windows 10/11では、WSLを利用してLinux環境を構築できます。以下の手順でセットアップします。

  1. 管理者権限でPowerShellを開き、以下のコマンドを実行
  2. wsl --install
  3. UbuntuなどのLinuxディストリビューションをインストール
  4. WSLを起動し、Bashを実行
  5. wsl

WSL環境では、Linuxと同じようにBashスクリプトを実行できます。

Git Bashを使用する方法

Git for Windowsをインストールすると、Git Bashが利用できます。これは、Windows上で動作するBash互換のターミナルです。

  1. Git for Windowsをダウンロードしてインストール
  2. Git Bashを起動し、以下のコマンドでBashのバージョンを確認
  3. $ bash --version

Git Bashは、WindowsネイティブのコマンドとBashコマンドを併用できるため、Windows環境での作業効率が向上します。

スクリプトファイルの作成と…

Bashスクリプトは、テキストファイルとして作成します。以下の手順でスクリプトを作成し、実行権限を付与します。

  1. スクリプトファイルを作成(例:backup.sh
  2. $ nano backup.sh
  3. 以下の内容を入力
  4. #!/bin/bash
    echo "Hello, World!"
  5. ファイルを保存し、実行権限を付与
  6. $ chmod +x backup.sh
  7. スクリプトを実行
  8. $ ./backup.sh
    Hello, World!

注意事項:スクリプトの先頭には、#!/bin/bash(シェバン)を記述します。これは、スクリプトを実行する際に使用するインタープリタを指定するためのものです。


Bashスクリプトの基本構文

Bashスクリプトの基本構文は、他のプログラミング言語と比較してシンプルです。以下に、主要な構文要素を解説します。

コメントの記述

Bashスクリプトでは、#記号を使用してコメントを記述します。コメントはスクリプトの実行には影響しません。

# これはコメントです
echo "Hello, World!"  # この行もコメントです

コマンドの実行

Bashスクリプトでは、コマンドラインと同じようにコマンドを実行できます。コマンドの実行結果は、変数に格納したり、別のコマンドに渡したりできます。

# 現在の日付を表示
date

ディレクトリの内容を表示

ls -l

コマンドの実行結果を変数に格納

current_date=$(date) echo "現在の日付: $current_date"

コマンド置換

コマンド置換は、コマンドの実行結果を変数に格納するための構文です。以下の2つの方法があります。

  • $(command):推奨される方法
  • `command`:古い形式(非推奨)
# 推奨される方法
current_user=$(whoami)
echo "現在のユーザー: $current_user"

古い形式(非推奨)

current_user=`whoami` echo "現在のユーザー: $current_user"

引数の取得

Bashスクリプトでは、コマンドライン引数を取得できます。引数は、$1$2、…、$9で参照できます。10個以上の引数を取得する場合は、${10}のように中括弧で囲みます。

#!/bin/bash
echo "スクリプト名: $0"
echo "第1引数: $1"
echo "第2引数: $2"
echo "すべての引数: $@"

このスクリプトを./script.sh arg1 arg2のように実行すると、以下の出力が得られます。

スクリプト名: ./script.sh
第1引数: arg1
第2引数: arg2
すべての引数: arg1 arg2

リダイレクトとパイプ

Bashスクリプトでは、リダイレクトとパイプを使用して、コマンドの入出力を制御できます。

  • >:出力をファイルに上書き
  • >>:出力をファイルに追記
  • <:ファイルから入力を読み込み
  • |:コマンドの出力を別のコマンドに渡す
# 標準出力をファイルにリダイレクト
echo "Hello, World!" > output.txt

標準出力を追記

echo "追記します" >> output.txt

コマンドの出力を別のコマンドに渡す

ls -l | grep ".sh"

ファイルから入力を読み込み

cat < input.txt

終了ステータス

Bashスクリプトでは、コマンドやスクリプトの実行結果を終了ステータス(exit status)で確認できます。終了ステータスは、$?変数で参照できます。終了ステータスが0の場合は成功、0以外の場合はエラーを示します。

# 成功するコマンド
ls -l
echo "終了ステータス: $?"

失敗するコマンド

ls /nonexistent echo "終了ステータス: $?"

変数とデータ型

Bashスクリプトでは、変数を使用してデータを格納し、操作できます。変数は、他のプログラミング言語と比較して柔軟な使い方ができますが、型の概念はありません。

変数の宣言と代入

Bashでは、変数を宣言する際に=を使用します。変数名と値の間にスペースを入れないように注意してください。

# 変数の宣言と代入
name="Alice"
age=30

変数の参照

echo "名前: $name" echo "年齢: $age"

注意事項:変数名には、英字、数字、アンダースコア(_)を使用できます。ただし、数字で始まる変数名は使用できません。

変数のスコープ

Bashでは、変数のスコープはデフォルトでグローバルです。関数内で宣言された変数は、関数の外でも参照できます。ローカル変数を宣言するには、localキーワードを使用します。

#!/bin/bash

グローバル変数

global_var="global"

関数内でローカル変数を宣言

function test_scope { local local_var="local" echo "関数内: global_var=$global_var, local_var=$local_var" } test_scope echo "関数外: global_var=$global_var, local_var=$local_var" # local_varは参照できない

特殊変数

Bashには、システムやスクリプトの状態を示す特殊変数が用意されています。

変数名説明
$0スクリプト名
$1$9第1〜第9引数
$@すべての引数
$#引数の数
$?直前のコマンドの終了ステータス
$$現在のスクリプトのプロセスID
$USER現在のユーザー名
$HOMEホームディレクトリのパス
$PWD現在の作業ディレクトリ

変数の操作

Bashでは、変数の操作に多くの組み込み機能が用意されています。以下に代表的な操作を紹介します。

文字列操作

# 文字列の長さを取得
str="Hello, World!"
echo ${#str}  # 13

部分文字列の取得

echo ${str:0:5} # Hello

文字列の置換

echo ${str/World/Universe} # Hello, Universe!

算術演算

Bashでは、算術演算を行う際に$(( ))構文を使用します。

# 足し算
echo $((1 + 2))  # 3

掛け算

echo $((3 * 4)) # 12

割り算

echo $((10 / 2)) # 5

剰余

echo $((10 % 3)) # 1

注意事項:Bashでは、浮動小数点演算はサポートされていません。浮動小数点演算が必要な場合は、bcコマンドやawkコマンドを使用します。

# bcコマンドを使用した浮動小数点演算
echo "3.14 * 2" | bc

6.28

配列

Bashでは、配列を使用して複数の値を格納できます。配列は、()で囲んで宣言します。

# 配列の宣言
fruits=("apple" "banana" "orange")

配列要素の参照

echo ${fruits[0]} # apple echo ${fruits} # banana

配列の長さを取得

echo ${#fruits[@]} # 3

配列要素の追加

fruits="grape" echo ${fruits[@]} # apple banana orange grape

環境変数

環境変数は、システムやユーザーの設定を格納する変数です。Bashスクリプトでは、環境変数を使用してシステムの情報を取得したり、設定を変更したりできます。

環境変数を表示するには、envコマンドまたはprintenvコマンドを使用します。

$ env
PATH=/usr/local/bin:/usr/bin:/bin
HOME=/home/user
USER=user
SHELL=/bin/bash

環境変数を設定するには、exportコマンドを使用します。

# 環境変数を設定
export MY_VAR="Hello, World!"

設定した環境変数を表示

echo $MY_VAR # Hello, World!

注意事項:環境変数は、現在のシェルとその子プロセスにのみ影響します。永続的に設定するには、~/.bashrc~/.bash_profileに追記します。


制御構造(条件分岐・ループ)

Bashスクリプトでは、条件分岐やループを使用して、柔軟な処理フローを実現できます。以下に、代表的な制御構造を解説します。

条件分岐(if文)

Bashのif文は、条件式に基づいて処理を分岐します。条件式は、testコマンドまたは[ ]構文で記述します。

# 基本的なif文
if [ 条件式 ]; then
  # 条件式が真の場合の処理
fi

例:ファイルが存在するかどうかを確認

if [ -f "/etc/passwd" ]; then echo "ファイルが存在します" fi

if-else文

if [ 条件式 ]; then # 条件式が真の場合の処理 else # 条件式が偽の場合の処理 fi

if-elif-else文

if [ 条件式1 ]; then # 条件式1が真の場合の処理 elif [ 条件式2 ]; then # 条件式2が真の場合の処理 else # すべての条件式が偽の場合の処理 fi

条件式の種類

Bashの条件式には、以下のような種類があります。

条件式説明
-f ファイル名ファイルが存在し、通常ファイルである
-d ディレクトリ名ディレクトリが存在する
-e ファイル名ファイルが存在する
-r ファイル名ファイルが読み取り可能である
-w ファイル名ファイルが書き込み可能である
-x ファイル名ファイルが実行可能である
-z 文字列文字列が空である
-n 文字列文字列が空でない
文字列1 == 文字列2文字列が等しい
文字列1 != 文字列2文字列が等しくない
整数1 -eq 整数2整数が等しい
整数1 -ne 整数2整数が等しくない
整数1 -lt 整数2整数1が整数2より小さい
整数1 -le 整数2整数1が整数2以下である
整数1 -gt 整数2整数1が整数2より大きい
整数1 -ge 整数2整数1が整数2以上である

注意事項[ ]構文を使用する際は、条件式の前後にスペースを入れる必要があります。また、==!=を使用する際は、[ ]構文内で使用します。

# 正しい例
if [ "$name" == "Alice" ]; then
  echo "名前はAliceです"
fi

誤った例(スペースが不足)

if ["$name"=="Alice"]; then echo "名前はAliceです" fi

case文

case文は、複数の条件に基づいて処理を分岐する際に使用します。case文は、if-elif-else文よりも読みやすい構文です。

# 基本的なcase文
case 変数 in
  パターン1)
    # パターン1に一致した場合の処理
    ;;
  パターン2)
    # パターン2に一致した場合の処理
    ;;
  *)
    # いずれのパターンにも一致しない場合の処理
    ;;
esac

例:引数に基づいて処理を分岐

case $1 in "start") echo "サービスを開始します" ;; "stop") echo "サービスを停止します" ;; "restart") echo "サービスを再起動します" ;; *) echo "無効な引数です" ;; esac

ループ処理

Bashでは、forループとwhileループを使用して、繰り返し処理を実行できます。

forループ

forループは、リストや範囲に基づいて処理を繰り返します。

# リストに基づくforループ
for fruit in apple banana orange; do
  echo "フルーツ: $fruit"
done

範囲に基づくforループ

for i in {1..5}; do echo "カウント: $i" done

C言語形式のforループ

for ((i=0; i<5; i++)); do echo "カウント: $i" done

コマンドの実行結果に基づくforループ

for file in $(ls); do echo "ファイル: $file" done

whileループ

whileループは、条件式が真の間、処理を繰り返します。

# 基本的なwhileループ
count=0
while [ $count -lt 5 ]; do
  echo "カウント: $count"
  ((count++))
done

無限ループ

while true; do echo "無限ループです" sleep 1 done

untilループ(条件式が偽の間、処理を繰り返す)

count=0 until [ $count -ge 5 ]; do echo "カウント: $count" ((count++)) done

ループの制御

ループ処理を制御するために、breakcontinueを使用できます。

# breakを使用してループを終了
for i in {1..10}; do
  if [ $i -eq 5 ]; then
    break
  fi
  echo "カウント: $i"
done

continueを使用して現在のイテレーションをスキップ

for i in {1..5}; do if [ $i -eq 3 ]; then continue fi echo "カウント: $i" done

関数の定義と活用

Bashスクリプトでは、関数を使用してコードの再利用性を高められます。関数を定義することで、同じ処理を何度も記述する手間を省けます。

関数の定義

Bashの関数は、以下の形式で定義します。

# 関数の定義
function 関数名 {
  # 処理
}

または

関数名() { # 処理 }

関数の呼び出し

関数名 引数1 引数2

以下は、関数の定義と呼び出しの例です。

#!/bin/bash

関数の定義

greet() { echo "Hello, $1!" }

関数の呼び出し

greet "Alice" greet "Bob"

関数の引数

Bashの関数では、引数を受け取ることができます。引数は、$1$2、...で参照できます。

#!/bin/bash

関数の定義

add() { local sum=$(( $1 + $2 )) echo "合計: $sum" }

関数の呼び出し

add 3 5 # 8 add 10 20 # 30

関数の戻り値

Bashの関数では、戻り値として終了ステータスを返すことができます。終了ステータスは、$?変数で参照できます。

#!/bin/bash

関数の定義

is_even() { local num=$1 if [ $((num % 2)) -eq 0 ]; then return 0 # 真 else return 1 # 偽 fi }

関数の呼び出し

is_even 4 echo "終了ステータス: $?" # 0(真) is_even 5 echo "終了ステータス: $?" # 1(偽)

注意事項:Bashの関数では、戻り値として文字列や数値を直接返すことはできません。戻り値として使用できるのは、終了ステータス(0〜255)のみです。文字列や数値を返すには、echoを使用して出力し、呼び出し元で受け取ります。

#!/bin/bash

関数の定義

get_message() { echo "Hello, World!" }

関数の呼び出しと出力の受け取り

message=$(get_message) echo "メッセージ: $message"

ローカル変数とグローバル変数

Bashの関数内で宣言された変数は、デフォルトでグローバル変数です。関数内でローカル変数を宣言するには、localキーワードを使用します。

#!/bin/bash

グローバル変数

global_var="global"

関数の定義

test_scope() { local local_var="local" echo "関数内: global_var=$global_var, local_var=$local_var" } test_scope echo "関数外: global_var=$global_var, local_var=$local_var" # local_varは参照できない

再帰関数

Bashでは、再帰関数を定義できます。再帰関数は、関数内で自分自身を呼び出す関数です。

#!/bin/bash

階乗を計算する再帰関数

factorial() { local n=$1 if [ $n -le 1 ]; then echo 1 else local prev=$(factorial $((n - 1))) echo $((n * prev)) fi }

関数の呼び出し

result=$(factorial 5) echo "5の階乗: $result" # 120

注意事項:再帰関数を使用する際は、スタックオーバーフローを防ぐために、再帰の深さに注意してください。Bashのデフォルトの再帰制限は1000です。


ファイル操作の自動化

Bashスクリプトは、ファイル操作の自動化に非常に適しています。ファイルの作成、コピー、移動、削除、検索など、さまざまなファイル操作を自動化できます。

ファイルの存在確認

ファイルが存在するかどうかを確認するには、-eオプションを使用します。

# ファイルが存在するか確認
if [ -e "/etc/passwd" ]; then
  echo "ファイルが存在します"
else
  echo "ファイルが存在しません"
fi

ファイルが通常ファイルか確認

if [ -f "/etc/passwd" ]; then echo "通常ファイルです" fi

ディレクトリが存在するか確認

if [ -d "/etc" ]; then echo "ディレクトリが存在します" fi

ファイルの作成
【編集・制作ポリシー】
本記事はRoute Bloom編集部が各ベンダー公式ドキュメント・エンジニア監修をもとに作成しています。インフラ・クラウド構築は環境により異なります。本番環境への適用前に必ずテストを実施してください。情報の正確性には万全を期していますが、最新情報は各公式ドキュメントをご確認ください。
ABOUT ME
たから
サラリーマンをしながら開業して経営やってます。 今年、本業で独立・別事業を起業予定です。 ◆経験:IT講師/インフラエンジニア/PM/マネジメント/採用/運用・保守・構築・設計 ◆取得資格:CCNA/CCNP/LPIC-1/AZ-900/FE/サーティファイC言語 ◆サイドビジネス:アパレル事業/複数のWEBメディアを運営