メインコンテンツへスキップ
レッスン 8 / 12推定時間:

ファイル操作とテスト演算子

シェルスクリプトでのファイル操作とテスト演算子を使った条件判定を学びます

このレッスンで学ぶこと

シェルスクリプトでファイルを安全に操作するには、テスト演算子を使った事前チェックが重要です。このレッスンでは:

  • ファイルの存在確認と種類判定
  • ファイルの属性チェック
  • 数値と文字列の比較演算子
  • 複合条件の作成

ファイルテスト演算子

基本的なファイルチェック

#!/bin/bash

file="test.txt"

# ファイルが存在するか
if [ -e "$file" ]; then
    echo "$file は存在します"
fi

# 通常ファイルか
if [ -f "$file" ]; then
    echo "$file は通常ファイルです"
fi

# ディレクトリか
if [ -d "$file" ]; then
    echo "$file はディレクトリです"
fi

# シンボリックリンクか
if [ -L "$file" ]; then
    echo "$file はシンボリックリンクです"
fi
CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

ファイルの権限チェック

#!/bin/bash

file="script.sh"

# 読み取り可能か
if [ -r "$file" ]; then
    echo "$file は読み取り可能です"
fi

# 書き込み可能か
if [ -w "$file" ]; then
    echo "$file は書き込み可能です"
fi

# 実行可能か
if [ -x "$file" ]; then
    echo "$file は実行可能です"
fi

# ファイルが空でないか
if [ -s "$file" ]; then
    echo "$file は空ではありません"
fi

ファイルの比較

#!/bin/bash

file1="file1.txt"
file2="file2.txt"

# file1がfile2より新しいか
if [ "$file1" -nt "$file2" ]; then
    echo "$file1$file2 より新しい"
fi

# file1がfile2より古いか
if [ "$file1" -ot "$file2" ]; then
    echo "$file1$file2 より古い"
fi

# 同じファイルか(inode比較)
if [ "$file1" -ef "$file2" ]; then
    echo "$file1$file2 は同じファイルです"
fi
CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

数値比較演算子

#!/bin/bash

a=10
b=20

# 等しい
if [ $a -eq $b ]; then
    echo "$a$b は等しい"
fi

# 等しくない
if [ $a -ne $b ]; then
    echo "$a$b は等しくない"
fi

# より大きい
if [ $a -gt $b ]; then
    echo "$a$b より大きい"
fi

# 以上
if [ $a -ge $b ]; then
    echo "$a$b 以上"
fi

# より小さい
if [ $a -lt $b ]; then
    echo "$a$b より小さい"
fi

# 以下
if [ $a -le $b ]; then
    echo "$a$b 以下"
fi

文字列比較演算子

#!/bin/bash

str1="hello"
str2="world"

# 文字列が等しい
if [ "$str1" = "$str2" ]; then
    echo "文字列は同じ"
fi

# 文字列が等しくない
if [ "$str1" != "$str2" ]; then
    echo "文字列は異なる"
fi

# 文字列が空でない
if [ -n "$str1" ]; then
    echo "文字列は空でない"
fi

# 文字列が空
if [ -z "$str3" ]; then
    echo "文字列は空"
fi

# 辞書順で比較(bashの[[ ]]を使用)
if [[ "$str1" < "$str2" ]]; then
    echo "$str1$str2 より辞書順で前"
fi
CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

複合条件

論理演算子の使用

#!/bin/bash

file="data.txt"
backup="data.txt.bak"

# AND条件(&&)
if [ -f "$file" ] && [ -r "$file" ]; then
    echo "$file は読み取り可能な通常ファイルです"
fi

# OR条件(||)
if [ ! -f "$backup" ] || [ "$file" -nt "$backup" ]; then
    echo "バックアップが必要です"
fi

# 複雑な条件
if [ -f "$file" ] && [ -s "$file" ] && [ -w "$file" ]; then
    echo "$file は編集可能です"
fi

高度な条件式([[ ]])

#!/bin/bash

# パターンマッチング
filename="document.pdf"
if [[ "$filename" == *.pdf ]]; then
    echo "PDFファイルです"
fi

# 正規表現マッチング
email="user@example.com"
if [[ "$email" =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then
    echo "有効なメールアドレスです"
fi

# 複合条件
if [[ -f "$file" && ( "$file" == *.txt || "$file" == *.log ) ]]; then
    echo "テキストファイルまたはログファイルです"
fi

実践演習:ファイル管理スクリプト

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

ディレクトリ操作の安全な実装

#!/bin/bash

# 安全なディレクトリ作成
create_directory() {
    local dir="$1"
    
    if [ -z "$dir" ]; then
        echo "エラー: ディレクトリ名が指定されていません"
        return 1
    fi
    
    if [ -e "$dir" ]; then
        if [ -d "$dir" ]; then
            echo "既存のディレクトリ: $dir"
        else
            echo "エラー: $dir は既に存在しますが、ディレクトリではありません"
            return 1
        fi
    else
        mkdir -p "$dir" && echo "ディレクトリを作成しました: $dir"
    fi
}

# 安全なファイル削除
safe_remove() {
    local file="$1"
    
    if [ ! -e "$file" ]; then
        echo "エラー: $file が存在しません"
        return 1
    fi
    
    if [ -d "$file" ]; then
        echo "エラー: $file はディレクトリです。rmdir または rm -r を使用してください"
        return 1
    fi
    
    # バックアップを作成してから削除
    if cp "$file" "$file.deleted.$(date +%s)"; then
        rm "$file" && echo "$file を削除しました(バックアップ済み)"
    else
        echo "エラー: バックアップの作成に失敗しました"
        return 1
    fi
}

まとめ

このレッスンでは、シェルスクリプトにおけるファイル操作とテスト演算子について学びました:

  • ファイルテスト: 存在確認、種類判定、権限チェック
  • 比較演算子: 数値比較、文字列比較、ファイル比較
  • 複合条件: 論理演算子を使った条件の組み合わせ
  • 安全な実装: エラーチェックを含む堅牢なスクリプト

これらの知識により、エラーの少ない信頼性の高いスクリプトを作成できます。

次のステップ

次のレッスンでは、エラーハンドリングとデバッグ技術について詳しく学び、より堅牢なスクリプトを作成する方法を習得します。

さらに学習を続けるには

素晴らしい学習ペースです!次のレッスンに進むには、無料会員登録をお願いします。無料会員では各コース3レッスンまで学習できます。

無料で続きを学ぶ

各コース3レッスンまで学習可能

学習進捗の自動保存

コース修了証明書の発行