← 語彙帳トップに戻る
🐚

Bash

Unix/Linuxの標準シェル。運用自動化・デプロイの必須言語

✅ サーバー運用自動化(systemd・cron)✅ CI/CDパイプライン✅ デプロイ・ビルドスクリプト✅ テキスト処理パイプライン(grep/sed/awk)✅ 開発環境セットアップ ⚠ クロスプラットフォーム GUI アプリ⚠ 大規模アプリケーション本体(中規模以上が限界)⚠ Windows専用ロジック(PowerShell/Python推奨)
📌 一言で言うと

37年動いたUnix/Linuxの標準シェル。サーバー運用とデプロイの共通語

Bash(Bourne Again SHell)は 1989年Brian FoxGNU 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 で書かれている。

⚖️ 他言語との比較
観点BashPythonZsh
言語の歴史 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 pipefailShellCheck で堅牢化も可能。#!/usr/bin/env bash のシバン1行で即スクリプト化できる学習コストの低さも強み。

選ばない理由

大規模アプリケーション本体には不向き(数百行を超えると保守が困難になり、Python/Go へ移行すべき)。シェル展開・単語分割・引用のルールが独特で、$VAR$VAR " の違いを誤るとセキュリティ脆弱性(コマンドインジェクション)に直結する。Windows サポートは WSL / Git Bash 経由のみで、ネイティブ実行は不可。対話シェルとしての完成度は zsh / fish に劣るため、補完・プロンプトを凝りたい用途には向かない。

💬 よくある会議での質問と答え方
Q.Bash と sh・zsh の違いは?
A.**sh**(Bourne Shell)は POSIX 標準の元祖で、配列・`[[ ]]` など Bash の独自拡張がない。**Bash** は GNU が sh を拡張したもので、Linux の事実上のデフォルト。**zsh** は Bash の拡張に**補完・プラグイン(Oh My Zsh)**を加えたもので、**macOS Catalina 以降のデフォルトシェル**。スクリプトを書くならまず Bash、知っていれば zsh、移植性最優先なら sh という棲み分け。
Q.Bash と PowerShell の違いは?
A.**Bash** は Unix 系・テキスト中心・戻り値は文字列ベース。**PowerShell** は Windows 起源・**.NET オブジェクト**をパイプラインで受け渡し。PowerShell は Windows 管理・Azure 連携で強く、Linux/macOS 向けオープンソース版(PowerShell Core / pwsh)も公開されている。CI の `run:` ブロックは **Bash がデフォルト**(GitHub Actions・GitLab CI 共に Linux ランナー)。Windows 中心なら PowerShell、Unix 系・クロスプラットフォームなら Bash が標準。
Q.set -euo pipefail とは何ですか?
A.シェルスクリプトを**堅牢化するための3つのフラグ**。`set -e` はコマンド失敗で即終了、`set -u` は未定義変数の参照でエラー、`set -o pipefail` はパイプラインの途中失敗を検出。**`#!/usr/bin/env bash` の直後に `set -euo pipefail`** を置くのがベストプラクティスで、これだけで本番事故の大半を防げる。
Q.ShellCheck はなぜ必要?
A.**bash/sh の静的解析ツール**(https://www.shellcheck.net/)。Word splitting・未定義変数・POSIX 違反・コマンドインジェクション候補を指摘してくれる。**GitHub Actions・CI・pre-commit** に組み込むのが事実上の標準で、Linux パッケージ・Homebrew・Docker イメージとして配布されている。
Q.Bash の配列の扱いで気をつけることは?
A.Bash の配列は **1次元・要素は文字列**。`arr=(a b c)` で生成し、`${arr[0]}` で参照、要素数は `${#arr[@]}`。**展開時は必ず `"${arr[@]}"` とダブルクォート**で囲む(クォートしないと単語分割で意図しない壊れ方をする)。連想配列(`declare -A`)は Bash 4+ で利用可能。
Q.CI/CD で Bash を使うときの落とし穴は?
A.**`set -euo pipefail`** を必ず付ける(前述)。**`./configure | make` のようなパイプライン**は pipefail なしだと make の失敗を検出できない。**環境変数のクォート**を怠ると空白入りパスで死ぬ。**`rm -rf $VAR`** は絶対 NG(`rm -rf -- "$VAR"` か配列ごと回す)。**`curl | sh`** はダウンロード失敗時に壊れたスクリプトを実行するリスクがあるため、`curl -fsSL ... -o script.sh && bash script.sh` のように明示的にダウンロード→実行に分離する。
🌐 エコシステム

パッケージマネージャ:—(言語としてのパッケージマネージャは無い・OS distro 経由: apt/dnf/brew/pacman)

主要ライブラリ

  • GNU coreutils — GNU プロジェクトの標準コマンド群。`ls`/`cat`/`cp`/`mv`/`rm`/`sort`/`uniq`/`wc`/`head`/`tail` 等。Bash スクリプトの中核
  • GNU grep — 高速なテキスト検索。`grep -E`(拡張正規表現)/`grep -r`(再帰)/ `-c`(カウント)等。ログ解析の定番
  • GNU sed — ストリームエディタ。`sed -i 's/foo/bar/g'`(インプレース置換)等、定型的テキスト変換に
  • GNU awk (gawk) — パターンスキャン&処理言語。**列指向テキスト処理**・集計レポート生成・ワンライナー集計で最強クラス
  • findutils(find / xargs) — `find` で条件に合うファイルを列挙し、`xargs` で各ファイルにコマンドを適用。`find . -name '*.log' | xargs rm` 等
  • curl / wget — URL からのダウンロード。`curl -fsSL` が CI スクリプト定番(f=失敗で非0・s=サイレント・S=エラー表示・L=リダイレクト追従)
  • jq — JSON プロセッサ。`cat response.json | jq '.items[] | .name'` 等、API レスポンスの抽出・整形・変換で必須
  • ShellCheck — Bash/sh の静的解析ツール。word splitting・未定義変数・POSIX 違反を CI で検出。`shellcheck script.sh` で即実行

ランタイム

  • GNU Bash — 公式実装。**Bash 5.3** が最新安定版(2024年公開)。大半の Linux ディストリビューションとレガシー macOS の標準シェル
  • dash — POSIX 互換・高速起動の軽量シェル。**Debian/Ubuntu の `/bin/sh` シンボリックリンク先**。systemd 起動スクリプト等で広く使われる
  • busybox ash — 組込み Linux・Alpine Linux で採用されている軽量シェル。最小限の POSIX シェル互換
  • zsh — macOS Catalina(10.15)以降のデフォルトシェル。Bash の拡張に強力な**タブ補完・プラグイン(Oh My Zsh)**・Glob 拡張を加えたもの
💻 コード例

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

  • 基本文法(変数・制御構文) — シェルの起動・シバン(`#!/usr/bin/env bash`)・変数(`$VAR`)・if/for/while・echo・read
  • コマンド実行と終了ステータス — `$?`・`&&` / `||` / `;` の使い分け・コマンド置換 `$(cmd)`・バッククォート
  • クォートと単語分割 — **ダブルクォート `"$VAR"`** とシングルクォート `'literal'` の違い・**単語分割(word splitting)の罠**
  • パイプとリダイレクト — `|` パイプ・`>` `>>` リダイレクト・`<` 入力・`/dev/null` の意味

中級(目安: 〜2-4週間)

  • シェル展開 — ブレース展開 `{a,b,c}`・パス展開(glob)`*.log`・変数展開・算術展開 `$(())`
  • grep / sed / awk — 3大テキスト処理コマンド。grep の `-E`/`-v`、sed の `s/foo/bar/g`、awk の `{print $1}`
  • 配列と for ループ — `arr=(a b c)`・`${arr[@]}`・`for x in "${arr[@]}"`(**必ずダブルクォート**)・連想配列 `declare -A`
  • 関数定義と引数処理 — `foo() { ...; }`・`$1` `$@` `shift`・`local`・`return`
  • ShellCheck での静的解析 — CI に組み込み・`shellcheck -S warning script.sh`・警告の意味と修正方法

上級(目安: 〜1-3ヶ月)

  • 堅牢化フラグ(set -euo pipefail) — エラー即終了・未定義変数検出・パイプライン失敗検出。trap / IFS 制御と組み合わせて**本番品質**へ
  • サブシェル・プロセス置換 — `(cd dir && cmd)` で作業ディレクトリを一時変更・`<(cmd)` `< <(cmd)` で擬似ファイル化
  • ジョブ制御・シグナル — `&` バックグラウンド・`wait`・`kill`・`trap` シグナルハンドラ・`jobs` / `fg` / `bg`
  • 移植性(POSIX / dash / busybox) — `#!/bin/sh` で書く場合の注意・Bash 拡張(`[[ ]]`・配列)を使わない書き方・Alpine での確認
  • テスト技法(bats / shellspec) — シェルスクリプトの単体テストフレームワーク **bats** / **shellspec** で CI 品質を担保