Unix/Linuxの標準シェル。運用自動化・デプロイの必須言語
37年動いたUnix/Linuxの標準シェル。サーバー運用とデプロイの共通語
Bash(Bourne Again SHell)は 1989年 に Brian Fox が GNU Project 向けに書いたシェルで、/bin/sh の代替として公開後、Linux の事実上の標準シェルとして広まった。sh(Bourne Shell)の後継に位置づけられ、POSIX シェル標準にほぼ準拠しつつ、配列・プロセス置換・拡張テスト [[ ]] などの独自拡張を持つ。
現在(2026年時点)は GNU Bash 5.x(5.3 が最新安定版)が大半の Linux ディストリビューションと macOS の標準シェル。macOS は Catalina(10.15、2019年)以降デフォルトシェルが zsh に切り替わったが、Linux サーバー・コンテナ・CI ランナー・Docker イメージでは依然 Bash がデフォルト。
用途は サーバー運用自動化(systemd ユニット・cron)・CI/CD(GitHub Actions / GitLab CI の run: ブロック)・デプロイスクリプト・ログ集計パイプライン(grep/awk/sed 連携)と、運用レイヤーの共通語として外せない。ShellCheck による静的解析が事実上の標準品質ゲート。
サーバー運用自動化(systemd・cron):systemd の ExecStart や cron のジョブとして、定型的な保守・バックアップ・ログローテーションを Bash で書く。Linux サーバーの運用自動化は Bash から入る。
CI/CD パイプライン(Harness / GitHub Actions / GitLab CI):GitHub Actions の `run:` ステップ・GitLab CI の `script:`・CircleCI のステップは実質 Bash ランナー。**テスト・ビルド・デプロイ**のオーケストレーションは Bash が事実上の共通語。
デプロイ・ビルドスクリプト:`./deploy.sh` 形式で `set -euo pipefail` を効かせた堅牢スクリプトがデファクト。Docker イメージビルド・DB マイグレーション・Feature Flag のトグル等に利用。
ログ集計・テキスト処理パイプライン:`grep | awk | sed | sort | uniq` のパイプラインは、ログのサマリ・アクセス集計・異常検知で今も最速・最短。`jq` を組み合わせれば JSON も同じ流儀で処理できる。
開発環境セットアップスクリプト:`bin/setup`・`Makefile` のシェル断片・`bootstrap.sh` 等、新しい開発者を最短で立ち上げるためのスクリプトも Bash。mise・asdf のようなバージョンマネージャも Bash で書かれている。
| 観点 | Bash | Python | Zsh |
|---|---|---|---|
| 言語の歴史 | 37年(1989-)・GNU製・POSIX拡張 | 35年(1991-)・汎用スクリプト | 35年(1990-)・Bash拡張・macOS標準 |
| 主な用途 | シェル操作・運用自動化・パイプライン | 汎用スクリプト・データ処理・Web | 対話シェル・補完強化・プラグイン |
| 学習コスト | 中(シェル展開・引用ルールが独特) | 中(読みやすい・明示的) | 中(Bash拡張+独自機能) |
| クロスプラットフォーム | Unix/Linux中心・WSL/Git Bash経由Windows | 完全(Win/macOS/Linux) | Unix/macOS中心・WSL可 |
| テキスト処理 | 最速(grep/sed/awk 連携・fork前提) | 標準ライブラリ豊富(pandas等) | Bash同様・zsh 補完が強力 |
| Windows対応 | WSL / Git Bash / MSYS 経由のみ | 完全対応(cpython・Win Wheels) | WSL / Git Bash 経由 |
| システム統合(systemd/cron/CI) | 最強・テキストの lingua franca | 外部呼び出しで可能 | Bash と同等 |
| 向いている場面 | サーバー運用・CI/CD・テキストパイプライン | 中規模スクリプト・データ処理・API連携 | 対話シェル・補完重視 |
選ぶ理由:
Unix/Linux のデフォルトシェルで、サーバー運用・CI/CD・Docker・systemd の共通語として外せない。POSIX シェル標準にほぼ準拠しつつ、配列・[[ ]]・プロセス置換等の実用拡張も持つ。テキスト処理パイプライン(grep/awk/sed/jq)はパイプで簡潔に書け、ログ集計やアクセス解析では最速クラス。set -euo pipefail と ShellCheck で堅牢化も可能。#!/usr/bin/env bash のシバン1行で即スクリプト化できる学習コストの低さも強み。
選ばない理由:
大規模アプリケーション本体には不向き(数百行を超えると保守が困難になり、Python/Go へ移行すべき)。シェル展開・単語分割・引用のルールが独特で、$VAR と $VAR " の違いを誤るとセキュリティ脆弱性(コマンドインジェクション)に直結する。Windows サポートは WSL / Git Bash 経由のみで、ネイティブ実行は不可。対話シェルとしての完成度は zsh / fish に劣るため、補完・プロンプトを凝りたい用途には向かない。
パッケージマネージャ:—(言語としてのパッケージマネージャは無い・OS distro 経由: apt/dnf/brew/pacman)
主要ライブラリ:
ランタイム:
Hello World(echo + シバン)
#!/usr/bin/env bash
# シバン(shebang)で bash を明示
echo "Hello, Bash!"
変数展開($VAR / ${VAR:-default})
#!/usr/bin/env bash
name="${1:-World}" # 第1引数が無ければ "World"
user="$USER" # 環境変数の展開
echo "Hello, $name! (user=$user)"
if / for ループ(パイプライン活用)
#!/usr/bin/env bash
# 5xx のアクセスログだけ抽出して件数カウント
for log in /var/log/nginx/*.log; do
if grep -q " 5[0-9][0-9] " "$log"; then
echo "$log: $(grep -c ' 5[0-9][0-9] ' "$log") errors"
fi
done
trap + set -euo pipefail(堅牢スクリプト)
#!/usr/bin/env bash
set -euo pipefail # エラー即終了・未定義変数エラー・パイプライン失敗検出
cleanup() {
echo "cleanup: removing $TMPDIR" >&2
rm -rf -- "$TMPDIR"
}
trap cleanup EXIT # 終了時(正常・エラー問わず)に必ず cleanup
TMPDIR="$(mktemp -d)"
echo "tempdir=$TMPDIR"
# ... 本処理 ...
関数定義 + main パターン
#!/usr/bin/env bash
set -euo pipefail
log() { printf '[%s] %s\n' "$(date +%H:%M:%S)" "$*"; }
deploy() {
local env="$1"
log "deploying to $env"
# ... rsync / kubectl / aws s3 sync ...
}
main() {
local target="${1:-staging}"
deploy "$target"
log "done"
}
main "$@"
初級(目安: 〜2-3日)
中級(目安: 〜2-4週間)
上級(目安: 〜1-3ヶ月)