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

Bashスクリプト入門【2026年6月更新】
Bashスクリプトを使いこなせば、日々の作業を自動化し、システム管理の効率を劇的に向上させられます。Linuxサーバーやクラウド環境で繰り返し実行するコマンドを1つのスクリプトにまとめることで、人的ミスを減らし、作業時間を最大90%短縮できます。本記事では、Bashスクリプトの基本から実践的なテクニックまで、具体的なサンプルコードと共に解説します。初心者でも理解できるように、段階的に学習できる構成となっており、すぐに実務で活用できる内容です。
目次
- Bashスクリプトとは何か
- 実行環境のセットアップ
- 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環境を構築できます。以下の手順でセットアップします。
- 管理者権限でPowerShellを開き、以下のコマンドを実行
- UbuntuなどのLinuxディストリビューションをインストール
- WSLを起動し、Bashを実行
wsl --installwslWSL環境では、Linuxと同じようにBashスクリプトを実行できます。
Git Bashを使用する方法
Git for Windowsをインストールすると、Git Bashが利用できます。これは、Windows上で動作するBash互換のターミナルです。
- Git for Windowsをダウンロードしてインストール
- Git Bashを起動し、以下のコマンドでBashのバージョンを確認
$ bash --versionGit Bashは、WindowsネイティブのコマンドとBashコマンドを併用できるため、Windows環境での作業効率が向上します。
スクリプトファイルの作成と…
Bashスクリプトは、テキストファイルとして作成します。以下の手順でスクリプトを作成し、実行権限を付与します。
- スクリプトファイルを作成(例:
backup.sh) - 以下の内容を入力
- ファイルを保存し、実行権限を付与
- スクリプトを実行
$ nano backup.sh#!/bin/bash
echo "Hello, World!"$ chmod +x backup.sh$ ./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です"
ficase文
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"
donewhileループ
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ループの制御
ループ処理を制御するために、breakとcontinueを使用できます。
# 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
本記事はRoute Bloom編集部が各ベンダー公式ドキュメント・エンジニア監修をもとに作成しています。インフラ・クラウド構築は環境により異なります。本番環境への適用前に必ずテストを実施してください。情報の正確性には万全を期していますが、最新情報は各公式ドキュメントをご確認ください。
} # banana
="grape"
echo ${fruits[@]} # apple banana orange grape



