Bashチートシート

中級 | 15分 で読める | 2025.01.10

公式ドキュメント

この記事の要点

grepsedawkのテキスト処理三銃士を使いこなす
• 変数展開・制御構文・リダイレクトの基本構文
set -eset -uで安全なシェルスクリプトを書く

基本コマンド

ファイル操作

# 一覧表示
ls              # 基本
ls -la          # 詳細(隠しファイル含む)
ls -lh          # 人間が読みやすいサイズ

# ディレクトリ移動
cd /path/to/dir
cd ~            # ホームディレクトリ
cd -            # 前のディレクトリ
cd ..           # 親ディレクトリ

# ファイル操作
cp file1 file2          # コピー
cp -r dir1 dir2         # ディレクトリコピー
mv file1 file2          # 移動/リネーム
rm file                 # 削除
rm -rf dir              # ディレクトリ削除(強制)
mkdir dir               # ディレクトリ作成
mkdir -p a/b/c          # 親ディレクトリも作成

# ファイル内容
cat file                # 全表示
head -n 10 file         # 先頭10行
tail -n 10 file         # 末尾10行
tail -f file            # リアルタイム監視
less file               # ページャー

ポイント: grep・sed・awkはBashの三大テキスト処理ツール。パイプで組み合わせることで強力なデータ加工ができます。

テキスト処理

# 検索
grep "pattern" file
grep -r "pattern" dir       # 再帰検索
grep -i "pattern" file      # 大文字小文字無視
grep -n "pattern" file      # 行番号表示
grep -v "pattern" file      # 除外

# 置換
sed 's/old/new/' file           # 最初の1つ
sed 's/old/new/g' file          # 全て置換
sed -i 's/old/new/g' file       # ファイル直接編集

# カラム抽出
awk '{print $1}' file           # 1列目
awk -F: '{print $1}' file       # 区切り文字指定
cut -d: -f1 file                # 区切り文字と列

# ソート
sort file
sort -n file            # 数値ソート
sort -r file            # 逆順
sort -u file            # 重複除去

# 重複
uniq file               # 連続した重複を除去
sort file | uniq        # 全重複を除去
uniq -c file            # 出現回数カウント

# カウント
wc -l file              # 行数
wc -w file              # 単語数
wc -c file              # バイト数

ファイル検索

# find
find . -name "*.txt"                    # 名前で検索
find . -type f -name "*.log"            # ファイルのみ
find . -type d -name "src"              # ディレクトリのみ
find . -mtime -7                        # 7日以内に更新
find . -size +100M                      # 100MB以上
find . -name "*.tmp" -delete            # 削除

# locate(インデックス検索)
locate filename

注意: rm -rfは取り消しできません。必ず対象パスを確認してから実行しましょう。特に変数展開と組み合わせる場合は要注意です。

変数

# 変数
name="Alice"
echo $name
echo ${name}

# 環境変数
export PATH="$PATH:/new/path"
export NODE_ENV=production

### 特殊変数

| 変数 | 説明 |
|---|---|
| `$0` | スクリプト名 |
| `$1` | 第1引数 |
| `$@` | 全引数(個別) |
| `$*` | 全引数(まとめて) |
| `$#` | 引数の数 |
| `$?` | 直前のコマンドの終了ステータス |
| `$$` | プロセスID |
| `$!` | 最後のバックグラウンドプロセスID |

### 文字列操作

| 構文 | 説明 |
|---|---|
| `${var:-default}` | 未定義ならデフォルト値 |
| `${var:=default}` | 未定義なら代入 |
| `${#var}` | 文字列長 |
| `${var#pattern}` | 先頭からパターン削除(最短) |
| `${var##pattern}` | 先頭からパターン削除(最長) |
| `${var%pattern}` | 末尾からパターン削除(最短) |
| `${var%%pattern}` | 末尾からパターン削除(最長) |
| `${var/old/new}` | 置換(最初の1つ) |
| `${var//old/new}` | 置換(全て) |

実践メモ: ${var:-default}構文を使えば、未定義変数にデフォルト値を設定できます。スクリプトの堅牢性が大幅に向上します。

制御構文

条件分岐

# if文
if [ "$name" = "Alice" ]; then
    echo "Hello Alice"
elif [ "$name" = "Bob" ]; then
    echo "Hello Bob"
else
    echo "Hello stranger"
fi

### 条件演算子

#### 文字列

| 演算子 | 説明 |
|---|---|
| `[ "$a" = "$b" ]` | 等しい |
| `[ "$a" != "$b" ]` | 等しくない |
| `[ -z "$a" ]` | 空文字 |
| `[ -n "$a" ]` | 空でない |

#### 数値

| 演算子 | 説明 |
|---|---|
| `[ $a -eq $b ]` | 等しい |
| `[ $a -ne $b ]` | 等しくない |
| `[ $a -lt $b ]` | より小さい |
| `[ $a -le $b ]` | 以下 |
| `[ $a -gt $b ]` | より大きい |
| `[ $a -ge $b ]` | 以上 |

#### ファイル

| 演算子 | 説明 |
|---|---|
| `[ -e file ]` | 存在する |
| `[ -f file ]` | ファイルである |
| `[ -d dir ]` | ディレクトリである |
| `[ -r file ]` | 読み取り可能 |
| `[ -w file ]` | 書き込み可能 |
| `[ -x file ]` | 実行可能 |

#### 論理演算

| 演算子 | 説明 |
|---|---|
| `[ cond1 ] && [ cond2 ]` | AND |
| `[ cond1 ] \|\| [ cond2 ]` | OR |
| `! [ cond ]` | NOT |

#### [[ ]] の使用(拡張テスト)

| 演算子 | 説明 |
|---|---|
| `[[ $name == A* ]]` | パターンマッチ |
| `[[ $name =~ ^A.*$ ]]` | 正規表現 |

ループ

# for
for i in 1 2 3 4 5; do
    echo $i
done

for i in {1..10}; do
    echo $i
done

for file in *.txt; do
    echo $file
done

for ((i=0; i<10; i++)); do
    echo $i
done

# while
while [ $count -lt 10 ]; do
    echo $count
    ((count++))
done

# ファイル読み込み
while read line; do
    echo $line
done < file.txt

case

case $option in
    start)
        echo "Starting..."
        ;;
    stop)
        echo "Stopping..."
        ;;
    restart)
        echo "Restarting..."
        ;;
    *)
        echo "Unknown option"
        ;;
esac

関数

# 関数定義
greet() {
    local name=$1
    echo "Hello, $name!"
    return 0
}

# 呼び出し
greet "Alice"

# 戻り値の取得
result=$(greet "Alice")
status=$?

ポイント: パイプ(|)リダイレクト(>)はBashの最も重要な概念。コマンドを繋げてデータを流す仕組みを理解しましょう。

リダイレクト・パイプ

コマンド説明
command > file出力リダイレクト(上書き)
command >> file出力リダイレクト(追記)
command 2> file標準エラーリダイレクト
command &> file両方リダイレクト
command < file入力リダイレクト
command1 | command2パイプ
ls | grep "txt" | wc -lパイプ連結
diff <(command1) <(command2)プロセス置換

Here Document

cat << EOF
複数行の
テキスト
EOF

便利なテクニック

コマンド説明
date=$(date +%Y%m%d)コマンド置換
files=$(ls *.txt)コマンド置換(ファイル一覧)
((result = 5 + 3))算術演算
result=$((5 + 3))算術演算(代入)
command &バックグラウンド実行
nohup command &ログアウト後も継続
command1 && command2成功時のみ次を実行
command1 || command2失敗時のみ次を実行
command1 ; command2常に両方実行
find . -name "*.txt" | xargs grep "pattern"xargs(検索)
find . -name "*.tmp" | xargs rmxargs(削除)
command | tee file画面とファイル両方に出力

注意: [ ][[ ]]は異なります。拡張テスト[[ ]]はBash固有で、パターンマッチや正規表現が使えます。POSIX互換が必要なら[ ]を使いましょう。

実践メモ: xargsfindの組み合わせは頻出パターン。find . -name "*.txt" | xargs grep "pattern"で大量ファイルの一括検索ができます。

シェルスクリプト例

#!/bin/bash
set -e  # エラーで停止
set -u  # 未定義変数でエラー

# 引数チェック
if [ $# -lt 1 ]; then
    echo "Usage: $0 <filename>"
    exit 1
fi

# ファイル存在チェック
if [ ! -f "$1" ]; then
    echo "File not found: $1"
    exit 1
fi

# 処理
echo "Processing $1..."

参考リソース

関連記事

この技術を体系的に学びたいですか?

未来学では東証プライム上場企業のITエンジニアが24時間サポート。月額24,800円から、退会金0円のオンラインIT塾です。

メールで無料相談する
← 一覧に戻る