Bashチートシート

中級 | 15分 で読める | 2025.01.10

基本コマンド

ファイル操作

# 一覧表示
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 "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

変数

# 変数
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}     # 置換(全て)

制御構文

条件分岐

# 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=$?

リダイレクト・パイプ

# 出力リダイレクト
command > file          # 上書き
command >> file         # 追記
command 2> file         # 標準エラー
command &> file         # 両方

# 入力リダイレクト
command < file

# パイプ
command1 | command2
ls | grep "txt" | wc -l

# Here Document
cat << EOF
複数行の
テキスト
EOF

# プロセス置換
diff <(command1) <(command2)

便利なテクニック

# コマンド置換
date=$(date +%Y%m%d)
files=$(ls *.txt)

# 算術演算
((result = 5 + 3))
result=$((5 + 3))

# バックグラウンド実行
command &
nohup command &         # ログアウト後も継続

# コマンド連結
command1 && command2    # 成功時のみ次を実行
command1 || command2    # 失敗時のみ次を実行
command1 ; command2     # 常に両方実行

# xargs
find . -name "*.txt" | xargs grep "pattern"
find . -name "*.tmp" | xargs rm

# tee
command | tee file      # 画面とファイル両方に出力

シェルスクリプト例

#!/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..."

関連記事

← 一覧に戻る