このレッスンで学ぶこと
シェルスクリプトでファイルを安全に操作するには、テスト演算子を使った事前チェックが重要です。このレッスンでは:
- ファイルの存在確認と種類判定
- ファイルの属性チェック
- 数値と文字列の比較演算子
- 複合条件の作成
ファイルテスト演算子
基本的なファイルチェック
#!/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
}
まとめ
このレッスンでは、シェルスクリプトにおけるファイル操作とテスト演算子について学びました:
- ファイルテスト: 存在確認、種類判定、権限チェック
- 比較演算子: 数値比較、文字列比較、ファイル比較
- 複合条件: 論理演算子を使った条件の組み合わせ
- 安全な実装: エラーチェックを含む堅牢なスクリプト
これらの知識により、エラーの少ない信頼性の高いスクリプトを作成できます。
次のステップ
次のレッスンでは、エラーハンドリングとデバッグ技術について詳しく学び、より堅牢なスクリプトを作成する方法を習得します。