初心者向け: 概要と特徴、学習順ガイド
Bashの全体像を把握し、各機能をどの順番で学べばよいかを案内するページです。「Bashとは何か」「Bashの特徴とトレードオフ」「実行の仕組み」「各機能の概要」を整理し、学習の道筋を示します。
Bashとは何か
Bash(バッシュ)は、Unix系OSのシェル(shell)です。シェルとは、ユーザーがコンピューターのカーネル(OS中枢)に命令を伝えるための橋渡し役となるプログラムのことです。
Bash は「Bourne Again SHell」の略称で、1989年にブライアン・フォックス様(Brian Fox)によって開発されました。Unix の初期シェル「Bourne Shell(sh)」を改良・拡張したもので、現在も macOS・Linux の標準シェルとして搭載されています。
Bashの誕生史(1977年Bourne shellの登場・1989年GNUプロジェクトでのフォックス様による開発・Linuxへの普及・現代のシェル事情)の詳細はIT用語 & 歴史辞典「Bash」にまとめています。
シェルとターミナルの違い
よく混同される2つの言葉ですが、役割が異なります。
| ターミナル(端末) | シェル | |
|---|---|---|
| 役割 | 文字を表示・受け付ける「画面」 | コマンドを解釈して実行する「処理エンジン」 |
| 例 | macOS の「ターミナル.app」、iTerm2 | bash、zsh、sh |
ターミナルはシェルを動かすための画面です。ターミナルを起動すると、その中でシェル(Bash など)が動き始め、コマンドの入力待ち状態になります。
コマンドラインインターフェース(CLI)
Bash は CLI(Command Line Interface:コマンドラインインターフェース)の代表的な実装です。CLI とは、文字をキーボードで打ち込んで操作するインターフェースのことです。マウスでアイコンをクリックする GUI(Graphical User Interface)とは対照的な方式です。
Bashの特徴とトレードオフ
Bashの長所
Bash には次のような特徴があります。
| 特徴 | 内容 |
|---|---|
| 標準搭載 | macOS・Linux でインストール不要。サーバー環境でもほぼ必ず使える |
| パイプ・リダイレクト | コマンドを組み合わせて複雑な処理を1行で書ける |
| スクリプト化 | 繰り返し作業を自動化できる。cron と組み合わせた定時実行も可能 |
| テキスト処理 | grep / sed / awk といったツールとの連携が強力 |
| 歴史の長さ | 1989年から使われており、情報・事例が豊富 |
Bashのトレードオフ
一方で、次のような点は他の言語と比べると扱いにくいことがあります。
| 点 | 内容 |
|---|---|
| 構文の独自性 | スペースのあり/なしで意味が変わるなど、Python・PHP などと異なるルールが多い |
| エラー処理 | デフォルトではエラーが起きてもスクリプトが止まらない(set -e での明示が推奨) |
| 型がない | 全ての値は基本的に文字列。数値計算には特別な記法が必要 |
| 複雑な処理 | 大規模なロジックには Python・Ruby などの方が適していることがある |
| 移植性 | bash 固有の機能(bashism)は sh で動かないことがある |
Bash は「サーバー管理・ファイル操作・定型作業の自動化」に向いており、「大規模なビジネスロジックの実装」には他の言語が適していることがあります。どちらが優れているという話ではなく、用途に応じた使い分けが求められます。
実行の仕組み
コマンドを打ち込んでから実際に処理されるまでの流れを理解しておくと、エラーの原因を特定しやすくなります。
コマンドを入力すると、まず Bash がそのコマンドを解釈します。変数の展開、パイプやリダイレクトの処理、コマンドの検索($PATH を使ってコマンドファイルを探す)を行い、最終的にカーネルに実行を依頼します。
スクリプトの実行フロー
コマンドを1つ打つのではなく、スクリプトファイル(.sh ファイル)として複数のコマンドをまとめて実行することもできます。
#!/bin/bash # シバン行: このファイルを bash で実行することを宣言 name="Kiryu" echo "Hello, $name"
実行するコマンドは次の通りです。
chmod +x greet.sh ./greet.sh Hello, Kiryu
1行目の #!/bin/bash をシバン(shebang)と呼びます。「このファイルは /bin/bash で実行してください」という宣言です。詳しくはシバン / chmod +xで解説しています。
基本コマンド — ファイルとディレクトリ操作
Bash を使う上で最初に必要になるコマンドです。
| コマンド | 概要 | よく使う例 |
|---|---|---|
ls | ファイル一覧の表示 | ls -la(隠しファイルも含め詳細表示) |
cd | ディレクトリの移動 | cd /var/log |
pwd | 現在のディレクトリを表示 | pwd |
cp | ファイル・ディレクトリのコピー | cp file.txt backup.txt |
mv | 移動・リネーム | mv old.txt new.txt |
rm | 削除 | rm -rf dir/(再帰削除。注意が必要) |
mkdir | ディレクトリ作成 | mkdir -p a/b/c(中間ディレクトリも一括作成) |
touch | 空ファイル作成・タイムスタンプ更新 | touch file.txt |
mkdir project cd project touch readme.txt ls -la cp readme.txt readme_backup.txt pwd /home/kazuma/project
各コマンドの詳細はls、cd / pwd、cp / mv / rm、mkdir / rmdir / touchで解説しています。
変数
Bash では変数に値を代入して再利用できます。= の前後にスペースを入れてはいけない点が、他のプログラミング言語と大きく異なります。
# 変数への代入(= の前後にスペースなし) name="Kiryu Kazuma" age=47 # 変数の参照($ を頭に付ける) echo "Name: $name" echo "Age: $age" Name: Kiryu Kazuma Age: 47
引用符の種類
name="Majima" # ダブルクォート: 変数展開される echo "Hello, $name" # Hello, Majima # シングルクォート: 変数展開されない(全て文字通りに扱われる) echo 'Hello, $name' # Hello, $name Hello, Majima Hello, $name
条件分岐 — if
Bash の if 文は、条件に応じて処理を切り替えます。条件式の書き方が独特で、[ ] や [[ ]] 内のスペースは必須です。
score=85
if [ $score -ge 80 ]; then
echo "合格: $score 点"
elif [ $score -ge 60 ]; then
echo "再試験: $score 点"
else
echo "不合格: $score 点"
fi
合格: 85 点
比較演算子
| 演算子 | 意味 | 例 |
|---|---|---|
-eq | 等しい | [ $a -eq $b ] |
-ne | 等しくない | [ $a -ne $b ] |
-gt | より大きい | [ $a -gt 10 ] |
-lt | より小さい | [ $a -lt 10 ] |
-ge | 以上 | [ $a -ge 10 ] |
-le | 以下 | [ $a -le 10 ] |
= | 文字列が等しい | [ "$str" = "hello" ] |
!= | 文字列が等しくない | [ "$str" != "hello" ] |
-z | 文字列が空 | [ -z "$str" ] |
-f | ファイルが存在する | [ -f "/etc/hosts" ] |
-d | ディレクトリが存在する | [ -d "/tmp" ] |
『if』 / 『elif』 / 『else』 の詳細はif / elif / elseで、条件式の全構文はtest / 条件式で解説しています。
ループ — for / while
for ループ
リストの各要素に対して処理を繰り返します。
# リストを直接書く
for member in Kiryu Majima Nishikiyama; do
echo "Member: $member"
done
Member: Kiryu Member: Majima Member: Nishikiyama
実装例は次の通りです。
# 数値範囲(1から5まで)
for i in {1..5}; do
echo "No. $i"
done
No. 1 No. 2 No. 3 No. 4 No. 5
while ループ
条件が真である限り繰り返します。
count=1
while [ $count -le 3 ]; do
echo "Count: $count"
count=$((count + 1))
done
Count: 1 Count: 2 Count: 3
『for』 の詳細はforで、『while』 / 『until』 の詳細はwhile / untilで解説しています。
関数
処理をまとめて名前を付け、繰り返し呼び出せます。引数は $1、$2... で受け取ります(他の言語の引数リストとは異なります)。
# 関数の定義
greet() {
local name=$1 # $1 が第1引数
echo "Hello, $name!"
}
# 関数の呼び出し
greet "Kiryu"
greet "Majima"
Hello, Kiryu! Hello, Majima!
戻り値
Bash の関数は数値(終了コード)しか直接返せません。文字列を「戻す」場合はコマンド置換を使います。
# 文字列を返す: echo で出力してコマンド置換で受け取る
get_name() {
echo "Kiryu Kazuma"
}
result=$(get_name)
echo "$result"
Kiryu Kazuma
パイプとリダイレクト
パイプとリダイレクトは Bash の最大の強みのひとつです。複数のコマンドを組み合わせて、複雑な処理を短いコードで表現できます。
パイプ(|)
パイプ | は、左のコマンドの出力を右のコマンドの入力に繋ぎます。
# ls の出力を grep に渡して .txt ファイルだけ絞り込む ls -la | grep ".txt"
同じ処理を次のようにも書けます。
# cat でファイルを読み、sort で並べ替え、uniq で重複除去、wc -l で行数を数える cat names.txt | sort | uniq | wc -l
リダイレクト
| 記号 | 意味 | 例 |
|---|---|---|
> | 標準出力をファイルへ書き出す(上書き) | echo "hello" > out.txt |
>> | 標準出力をファイルへ追記 | echo "world" >> out.txt |
< | ファイルを標準入力として読み込む | sort < list.txt |
2> | 標準エラー出力をファイルへ書き出す | cmd 2> err.log |
&> | 標準出力と標準エラーを両方ファイルへ | cmd &> all.log |
パイプの詳細はパイプで、リダイレクトの詳細はリダイレクト(出力)とリダイレクト(入力)/ ヒアドキュメントで解説しています。
テキスト処理 — grep / sed / awk
Bash がサーバー管理や自動化で強力な理由のひとつが、テキスト処理ツールとの連携です。
grep — 行の検索・抽出
ファイルや標準入力から、パターンに一致する行を抽出します。
# "error" を含む行を抽出
grep "error" app.log
# -i: 大文字小文字を無視
grep -i "Error" app.log
# -n: 行番号を表示
grep -n "error" app.log
# 正規表現で検索(数字が3桁以上続く行)
grep -E "[0-9]{3,}" data.txt
sed — 置換・行の編集
ファイルの内容を変換します。文字列の置換に使います。
# "Kiryu" を "Akiyama" に置換して出力 sed 's/Kiryu/Akiyama/' names.txt # -i: ファイルを直接書き換える(macOS では -i '' が必要) sed -i 's/old/new/g' file.txt
awk — 列の抽出・集計
スペースやタブで区切られたテキストから、特定の列を抽出したり集計したりします。
# スペース区切りの2列目を表示
awk '{print $2}' data.txt
# 3列目が100以上の行だけ表示
awk '$3 >= 100' scores.txt
ファイル操作
ファイルの内容を確認したり加工したりするコマンドです。
| コマンド | 概要 |
|---|---|
cat | ファイルの内容を全部表示 |
head | ファイルの先頭N行を表示(デフォルト10行) |
tail | ファイルの末尾N行を表示。-f でリアルタイム追従 |
less | ページ単位で閲覧(大きなファイルに適する) |
wc | 行数・単語数・バイト数を表示 |
sort | 行を並べ替える |
uniq | 連続する重複行を除去(sort との組み合わせが定番) |
find | 条件を指定してファイルを検索 |
tar | ファイルのアーカイブ・圧縮・展開 |
# ファイルの末尾100行をリアルタイム表示 tail -f /var/log/app.log # 特定の拡張子のファイルを検索 find /home/date -name "*.log" -type f # ディレクトリごとアーカイブして gzip 圧縮 tar czf backup.tar.gz project/
各コマンドの詳細はhead / tail、wc / sort / uniq、find、tarで解説しています。
プロセス管理
動いているプロセスの確認・制御もシェルの重要な用途です。
| コマンド | 概要 |
|---|---|
ps | 動いているプロセスの一覧を表示 |
top | CPU(Central Processing Unit — コンピュータの演算処理を行う中央演算装置)・メモリの使用状況をリアルタイム表示 |
kill | プロセス ID(PID)を指定してプロセスを終了 |
pkill | プロセス名で終了 |
& | コマンドをバックグラウンドで実行 |
# 動いている全プロセスを表示 ps aux # "nginx" という名前のプロセスを検索 ps aux | grep nginx # プロセス ID 1234 を終了 kill 1234 # バックグラウンドで実行 ./long_process.sh &
各コマンドの詳細はps / top / htopとkill / pkill / killallで解説しています。バックグラウンド実行の詳細はバックグラウンドジョブで解説しています。
よくあるエラーと解決方法
command not found
『command not found』 は、打ち込んだコマンドが見つからないときに表示されます。原因はいくつか考えられます。コマンドがインストールされていない、コマンド名のタイプミス、あるいはコマンドが 『$PATH』 に含まれていないディレクトリにある場合です。
greet -bash: greet: command not found
コマンドの場所を調べるには 『which』 コマンドを使います。
which bash /bin/bash
= の前後にスペースを入れてしまう
変数への代入では = の前後にスペースを入れてはいけません。スペースがあると Bash はコマンドとして解釈してしまいます。
name = "Kiryu" # エラー: name をコマンドとして実行しようとする name="Kiryu" # 正しい
[ ] の内側のスペースを忘れる
条件式の [ と ] の内側には必ずスペースが必要です。
if [$count -eq 1]; then # エラー: [1 というコマンドを探してしまう if [ $count -eq 1 ]; then # 正しい
スクリプトに実行権限がない
./script.sh を実行しようとすると「Permission denied」と表示される場合は、実行権限が付いていません。chmod +x で付与します。
chmod +x script.sh ./script.sh
改行コードが Windows 形式(CRLF)になっている
Windows で作成したスクリプトファイルを Linux・macOS で実行すると、改行コードの違い(CRLF vs LF)でエラーが出ることがあります。『dos2unix』 コマンドで変換できます。
dos2unix script.sh
コメントの書き方
Bashスクリプトでコメントを書くには『#』を使います。『#』から行末までがコメントになり、シェルによる実行時に無視されます。Bashにはブロックコメント専用の記法はなく、複数行コメントは各行に『#』を付けて書きます。
コメントの種類
| 種類 | 書き方 | 概要 |
|---|---|---|
| 一行コメント | # テキスト | 『#』から行末までがコメントになります。コードの右側に補足を添えるときにも使います。 |
| シバン(shebang) | #!/usr/bin/env bash | スクリプトの1行目に書く特殊な『#!』行です。どのシェルで実行するかをOSに伝えます。コメントではありませんが、同じ『#』で始まります。 |
サンプル
#!/usr/bin/env bash
# backup.sh — 指定ディレクトリを tar.gz で圧縮してバックアップする
# 引数チェック: 引数が1つでなければ使い方を表示して終了
if [ "$#" -ne 1 ]; then
echo "Usage: $0 " >&2
exit 1
fi
TARGET="$1"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
OUTPUT="${TARGET%/}_${TIMESTAMP}.tar.gz"
# ハイフンで始まるディレクトリを安全に扱うため -- を付ける
tar czf "$OUTPUT" -- "$TARGET"
echo "Saved: $OUTPUT"
コメントの内容は自由です。主な使い道としては「なぜこう書いたか」「何をしているか」「TODO」「メモ」などのパターンが多く見られますが、必要だと思った内容を自由に記載してしまって問題ありません。コメントアウトによる一時無効化の慣習や詳細はコメント解説ページで詳しく解説しています。
おすすめ学習順
このページで全体像を把握したら、以下の順番でBash辞典の各ページを読み進めると効率的に学べます。
| ステップ | テーマ | ページ |
|---|---|---|
| 1 | 環境構築・基本操作 | 【環境構築】Bashの実行環境 ↓ .shファイルの作成と実行方法 ↓ シバン / chmod +x |
| 2 | ファイル操作コマンド | ls ↓ cd / pwd ↓ cp / mv / rm ↓ mkdir / rmdir / touch |
| 3 | 変数・条件・ループ | 変数の定義と参照 ↓ if / elif / else ↓ for ↓ while / until |
| 4 | 関数・スクリプト応用 | 関数の定義 ↓ 関数の引数・戻り値 ↓ 特殊変数 ↓ test / 条件式 |
| 5 | パイプ・リダイレクト | パイプ ↓ リダイレクト(出力) ↓ リダイレクト(入力)/ ヒアドキュメント |
| 6 | テキスト処理 | grep ↓ sed ↓ awk ↓ wc / sort / uniq |
| 7 | ファイル・プロセス管理 | find ↓ head / tail ↓ ps / top / htop ↓ kill / pkill / killall |
| 8 | 応用・自動化 | crontab ↓ バックグラウンドジョブ ↓ ssh / scp / rsync |
概要
Bash = Unix系OSの標準シェル(Bourne Again SHell)
役割
- ユーザーがOS(カーネル)にコマンドを伝える橋渡し
- コマンドの自動化・スクリプト化
- パイプやリダイレクトでツールを組み合わせる
Bash の強み
- macOS・Linux で標準搭載。インストール不要
- サーバー管理・定型作業の自動化に向いている
- grep / sed / awk などのテキスト処理ツールとの連携が強力
Bash の特性
- 変数代入では
=の前後にスペース不可 - 条件式
[ ]の内側のスペースは必須 - 全ての値は基本的に文字列(型がない)
- エラーが起きても止まらない(
set -eで明示的に設定する)
主な機能
- ファイル操作:
ls/cd/cp/mv/rm - 変数・条件・ループ・関数
- パイプ
|とリダイレクト>>>< - テキスト処理:
grep/sed/awk - プロセス管理:
ps/kill/ バックグラウンド実行
Bash に向いていること
- ファイルのバックアップ・移動・整理の自動化
- ログの監視・集計・アラート通知
- cron との組み合わせによる定時実行
- サーバーへのデプロイスクリプト
- 複数コマンドの組み合わせ(パイプライン処理)
他の言語と組み合わせるタイミング
大規模なビジネスロジック・複雑なデータ処理・オブジェクトを扱う処理には、Python・Ruby・Perl などのスクリプト言語が適しています。「ファイルを整理する・コマンドを自動実行する」には Bash、「データを解析する・API(Application Programming Interface — ソフトウェア同士がデータをやりとりするための窓口)と連携する」には別の言語、という用途ごとの使い分けができます。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。