言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

Linux & Mac & Bashコマンド辞典

  1. トップページ
  2. Linux & Mac & Bashコマンド辞典
  3. 初心者向け: 概要と特徴、学習順ガイド

初心者向け: 概要と特徴、学習順ガイド

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」、iTerm2bash、zsh、sh

ターミナルはシェルを動かすための画面です。ターミナルを起動すると、その中でシェル(Bash など)が動き始め、コマンドの入力待ち状態になります。

コマンドラインインターフェース(CLI)

Bash は CLI(Command Line Interface:コマンドラインインターフェース)の代表的な実装です。CLI とは、文字をキーボードで打ち込んで操作するインターフェースのことです。マウスでアイコンをクリックする GUI(Graphical User Interface)とは対照的な方式です。

ユーザー ターミナル (画面) Bash (シェル) OS

Bashの特徴とトレードオフ

Bashの長所

Bash には次のような特徴があります。

特徴内容
標準搭載macOS・Linux でインストール不要。サーバー環境でもほぼ必ず使える
パイプ・リダイレクトコマンドを組み合わせて複雑な処理を1行で書ける
スクリプト化繰り返し作業を自動化できる。cron と組み合わせた定時実行も可能
テキスト処理grep / sed / awk といったツールとの連携が強力
歴史の長さ1989年から使われており、情報・事例が豊富

Bashのトレードオフ

一方で、次のような点は他の言語と比べると扱いにくいことがあります。

内容
構文の独自性スペースのあり/なしで意味が変わるなど、Python・PHP などと異なるルールが多い
エラー処理デフォルトではエラーが起きてもスクリプトが止まらない(set -e での明示が推奨)
型がない全ての値は基本的に文字列。数値計算には特別な記法が必要
複雑な処理大規模なロジックには Python・Ruby などの方が適していることがある
移植性bash 固有の機能(bashism)は sh で動かないことがある

Bash は「サーバー管理・ファイル操作・定型作業の自動化」に向いており、「大規模なビジネスロジックの実装」には他の言語が適していることがあります。どちらが優れているという話ではなく、用途に応じた使い分けが求められます。

実行の仕組み

コマンドを打ち込んでから実際に処理されるまでの流れを理解しておくと、エラーの原因を特定しやすくなります。

ターミナル コマンドの入出力画面 Bash(シェル) コマンドの解釈・変数展開・パイプ制御 カーネル(OS中枢) システムコール実行・ファイルI/O・プロセス管理 ハードウェア・ファイルシステム

コマンドを入力すると、まず 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

各コマンドの詳細はlscd / pwdcp / mv / rmmkdir / 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

変数の詳細は変数の定義と参照で、特殊変数($?$0$$ など)は特殊変数で解説しています。

条件分岐 — 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

各コマンドの詳細はgrepsedawkで解説しています。

ファイル操作

ファイルの内容を確認したり加工したりするコマンドです。

コマンド概要
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 / tailwc / sort / uniqfindtarで解説しています。

プロセス管理

動いているプロセスの確認・制御もシェルの重要な用途です。

コマンド概要
ps動いているプロセスの一覧を表示
topCPU(Central Processing Unit — コンピュータの演算処理を行う中央演算装置)・メモリの使用状況をリアルタイム表示
killプロセス ID(PID)を指定してプロセスを終了
pkillプロセス名で終了
&コマンドをバックグラウンドで実行
# 動いている全プロセスを表示
ps aux

# "nginx" という名前のプロセスを検索
ps aux | grep nginx

# プロセス ID 1234 を終了
kill 1234

# バックグラウンドで実行
./long_process.sh &

各コマンドの詳細はps / top / htopkill / 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辞典の各ページを読み進めると効率的に学べます。

概要

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 — ソフトウェア同士がデータをやりとりするための窓口)と連携する」には別の言語、という用途ごとの使い分けができます。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。