第16回 ファイルとディレクトリを判定しよう:-f・-d・-eフラグの基本 | はじめてのシェルスクリプト

* 当サイトでは、コンテンツの一部に広告を掲載しています。

System Note $ cat /proc/ai-disclosure

本記事の構成および論理分析にはAI(人工知能)を使用しています。情報の正確性は、システム管理者(UNIXユーザー)による手動検証済みです。

第16回 ファイルとディレクトリを判定しよう:-f・-d・-eフラグの基本 | はじめてのシェルスクリプト

はじめてのシェルスクリプト | 第16回

目次

はじめに

この連載では、macOS のターミナルで sh を使いながら、シェルスクリプトの基本を順番に学んでいきます。

ここまでの回で、変数・条件分岐・ループ・関数・計算・文字列操作と、シェルスクリプトの基本的な要素をひとつひとつ積み上げてきました。これだけでも相当なことができるようになっています。

しかし、実際のスクリプトで「処理しようとしたファイルが存在しなかった」「指定した場所がディレクトリではなかった」という場面に出くわすと、スクリプトが途中でエラーになってしまいます。そうした事態を防ぐためには、「存在を確認してから処理する」という考え方が重要です。

第16回では、-f -d -e といったフラグを使って、ファイルやディレクトリが存在するかどうかを判定する基本を学びます。これを身につけると、安全で堅牢なスクリプトを書くための感覚が身についてきますよ。

この回で学ぶこと

  • -f -d -e の意味
  • ファイルの有無で分岐する方法
  • ディレクトリの有無で分岐する方法
  • 存在確認をしてから処理する考え方
  • 安全に確認する理由
  • 判定結果で表示が変わる例
  • 初学者がつまずきやすい書き方

ファイルとディレクトリを判定する

-f

-f は、指定したものが通常ファイルとして存在するかを確認します。

[ -f "README.md" ]

-d

-d は、指定したものがディレクトリとして存在するかを確認します。

[ -d "sample_dir" ]

-e

-e は、ファイルかディレクトリかを問わず、何かが存在するかを確認します。

[ -e "next_task.txt" ]

サンプルコード

check_path.sh に次の内容を保存します。

#!/bin/sh

if [ -f "README.md" ]; then
  echo "README.md is a file"
fi

if [ -d "sample_dir" ]; then
  echo "sample_dir is a directory"
else
  echo "sample_dir does not exist as a directory"
fi

if [ -e "next_task.txt" ]; then
  echo "next_task.txt exists"
fi

実行手順

1. ファイルを作成して保存する

エディタで check_path.sh という名前のファイルを作成し、次の内容を保存します。

#!/bin/sh

if [ -f "README.md" ]; then
  echo "README.md is a file"
fi

if [ -d "sample_dir" ]; then
  echo "sample_dir is a directory"
else
  echo "sample_dir does not exist as a directory"
fi

if [ -e "next_task.txt" ]; then
  echo "next_task.txt exists"
fi

2. スクリプトを実行する

次のコマンドを実行します。

sh check_path.sh

実行結果の例です。

README.md is a file
sample_dir does not exist as a directory
next_task.txt exists

3. ディレクトリを作って試す

sample_dir というディレクトリを作成してから、もう一度実行すると表示結果が変わります。

このように、存在の有無によって処理を分けられます。

コードの読み方

[ -f “README.md” ]

README.md が通常ファイルとして存在するかを確認しています。

[ -d “sample_dir” ]

sample_dir がディレクトリとして存在するかを確認しています。

[ -e “next_task.txt” ]

next_task.txt が存在するかどうかを確認しています。

確認してから処理する理由

ファイルやディレクトリを使う前に存在確認をしておくと、安全に処理を進めやすくなります。

存在しないものを前提に処理すると、エラーになったり、意図しない動作になったりします。

そのため、判定してから分岐する考え方が重要です。

初学者がつまずきやすい点

-f-d を混同する

-f は通常ファイル、-d はディレクトリです。

同じ意味ではありません。

-e の意味が広いことを忘れる

-e は、ファイルかディレクトリかを区別せず、「存在するか」だけを見ます。

条件式の空白を崩す

[ -f "README.md" ] のように、[ ] の前後には空白が必要です。

よくあるエラー

判定が思った通りに真にならない

現在のディレクトリに対象があるか確認してください。

pwdls を使うと分かりやすいです。

ディレクトリなのに -f で判定している

-f は通常ファイル専用です。

ディレクトリなら -d を使ってください。

[: missing ]

閉じる ] を書き忘れている可能性があります。

条件式の形を見直してください。

練習用コード

次の内容で path_check_practice.sh を作成して実行してみてください。

#!/bin/sh

if [ -f "next_task.txt" ]; then
  echo "next_task.txt is a file"
fi

if [ -d "images" ]; then
  echo "images is a directory"
else
  echo "images is not a directory"
fi

if [ -e "README.md" ]; then
  echo "README.md exists"
fi

ファイル名やディレクトリ名を変えて、判定結果がどう変わるか確認してください。

この回で理解しておくこと

  • -f は通常ファイルの存在確認に使う
  • -d はディレクトリの存在確認に使う
  • -e は存在するかどうかを広く確認する
  • 存在確認をしてから処理すると安全性が上がる
  • if 文と組み合わせると判定結果で分岐できる
  • 条件式の空白や記号は正確に書く必要がある

まとめ

今回は、-f -d -e を使って、ファイルやディレクトリの存在を判定する基本を確認しました。

存在確認をしてから処理する考え方は、実用的なスクリプトを書くときに重要です。

次回は、リダイレクトとパイプの基本を学びます。

次回予告

次回は「リダイレクトとパイプを使おう」です。

出力先を変えたり、コマンド同士をつないだりする基本を確認します。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

のいのアバター のい UNIX Cafe マスター

Macintosh Color Classicから始まった旅は、長いWindows時代を経て、Windows10のサポート終了をきっかけにUNIXの世界へ戻ってきました。UNIX Cafeでは、UNIX・Linux・そしてMacな世界を、むずかしい言葉を使わず、物語のように書いています。プログラミングは、アイデアをコンピューターに伝えるための言葉です。簡単な単語と文法を覚えれば、誰でもコマンドを使えます。ぜひ一度、やさしいプログラミングの世界をのぞいてみてください。

Created by UNIX Cafe

目次