サイトアイコン スグブログ

【シェルスクリプト】ifを使いファイルが存在するかで場合分けする方法

データベース

シェルスクリプトifファイルが存在するか確認して、処理を場合分けしたい場面はよくあります。

どのようにすれば良いかわからないという人の為に、今回記事にします。

普段シェルスクリプトを使用している筆者が、実例を元に解説します。

windowsのプロンプトで使用できるbatやpythonやphpを使用して、業務効率化やWebサイトを作成しております。javaやシェルスクリプトなど、様々なプログラミングを行った実績ありの筆者です。

またファイルが存在するかだけでなく、存在しない場合、その他のオプション、実際業務で使用できる応用も一緒に解説します。

シェルスクリプトのifを使用してファイルが存在するかで場合分け

シェルスクリプトでファイルが存在するかチェックする基礎

シェルスクリプトでファイルが存在するかどうかを判定するには以下を使用します。

if [ -e ファイル名 ]; then
 処理するコマンド
fi

シェルスクリプトの解説

場合分けするにはスクリプトではお馴染みの「if」を使用します。

ファイルが存在するかどうかは、テストコマンドの「[」を使用します。

オプションで「-e」を使用します。ファイルが存在すれば真、なければ偽となります。

結果、ファイルが存在すれば処理するコマンドが実行されます。なければ実行されません。

シェルスクリプトでifを使用してファイルが存在するかやってみた

では実際にシェルスクリプトで試してみます。

以下のシェルスクリプトを作成してみます。

#!/bin/bash

if [ -e file_exist.txt ]; then
 echo 'ファイルは存在します'
else
 echo 'ファイルは存在しません'
fi

シェルスクリプトと同じ階層に指定したファイルが存在すれば「ファイルは存在します」と、なければ「ファイルは存在しません」とechoコマンドで表示する

このシェルスクリプトと同じディレクトリに、以下のコマンドで「file_exist.txt」を作成します。

touch file_exist.txt

実行して見ます。

シェルスクリプトを実行する方法

実行コマンドは以下です。

bash シェルスクリプト名

以下でも可能です。

source シェルスクリプト名

または「source」省略形の以下でも大丈夫です。

. シェルスクリプト名

※sourceコマンドは実行権が不要なので便利ですが、変数や関数などが保持される事に注意です。

または実行権をつけて以下でもよいです。

chmod +x シェルスクリプト名
./シェルスクリプト名

シェルスクリプトを実行するコマンドの説明は以下の記事で詳しく説明しています。

ファイルが存在する時のシェルスクリプト実行結果

シェルスクリプトを実行すると以下の結果となりました。

[root@localhost file_exist]# . file_exist.sh
ファイルは存在します

ファイルがあるので「ファイルが存在します」と表示されました。

ファイルが存在しない時のシェルスクリプト実行結果

では以下のコマンドで「file_exist.txt」を削除します。

rm -f file_exist.txt

-fオプションは強制的に削除します。これがなければ削除してよいか確認がはいります。

このファイルが存在しない状態でシェルスクリプトを実行してみます。

[root@localhost file_exist]# . file_exist.sh
ファイルは存在しません

ファイルがないので「ファイルが存在しません」と表示されました。

成功しました。

ifで使用できるその他のテストオプション

その他にもifテストコマンドでよく使用するオプションをご紹介しておきます。

オプション説明
-eファイルが存在する
-fファイルである
-dディレクトリである
-n文字列が0でない
-z文字列が0である
-v変数が定義されている
-rファイルが存在し、読み取り可能である
-wファイルが存在し、書き込み可能である
-xファイルが存在し、実行可能である
-hファイルが存在し、シンボリックリンクである
-sファイルが存在し、サイズが0より大きい
よく使用するシェルスクリプトテストオプション一覧

ifを使いファイルが存在しないかで場合分けする方法

おまけで逆のオプションを指定する方法もお伝えしておきます。

今回で言うとファイルが存在しない場合はどのように記述するかです。

否定系の記述は「!」を前につけると可能です。

if [ ! -e ファイル名 ]; then
 処理するコマンド
fi

先程のシェルスクリプトを以下に変えます。

if [ ! -e file_exist.txt ]; then
 echo 'ファイルは存在しません'
else
 echo 'ファイルは存在します'
fi

ではこちらも実際にシェルスクリプトを実行してみます。

シェルスクリプトの実行結果は以下となりました。

[root@localhost file_exist]# . file_exist.sh
ファイルは存在しません

成功しました。

【応用】ifを使い業務などで実際使用するシェルスクリプトご紹介

では業務などで実際使用できる例もご紹介しておきます。

以下のシェルスクリプトを記述してみます。

#!/bin/bash

file=file_exist.txt
if [ -n "$file" ] && [ ! -e "$file" ]; then
 touch "$file"
 echo 'ファイルが存在していないので作成しました'
else
 echo 'ファイル名が空か存在しているので何もしませんでした'
fi

ファイル名が空でない、かつファイルが存在しない場合のみファイルを作成するシェルスクリプトです。

応用のシェルスクリプトの説明

「file」という変数にファイル名を代入しています。

「[」コマンドのオプション「-n」でファイル名が空でない事を判定しています。

※こればなければ「file」変数が空の場合でも判定が真となり、ファイルは作成されないが「作成しました」と表示されてしまう

「&&」でファイル名が空でなければ次の判定に行きます。file変数に「file_exist.txt」が入っており真なので右の判定に行きます

「! -e」オプションでファイルが存在しないを判定しています。

これでファイルが存在していなければ作成、存在していれば何もしないと言った処理が可能になります。

実際にシェルスクリプトを実行して見ます。

[root@localhost file_exist]# . file_exist.sh
ファイルが存在していないので作成しました

ファイルが作成されたので「ls」コマンドで確認してみましょう。

[root@localhost file_exist]# ls
file_exist.sh  file_exist.txt

「file_exist.txt」ファイルが存在する事が確認出来ました。

では先程のシェルスクリプトをもう一回実行してみます。

[root@localhost file_exist]# . file_exist.sh
ファイル名が空か存在しているので何もしませんでした

今度はファイルが存在するので、何もしないメッセージが表示されました。

シェルスクリプトのifを使いファイルが存在するかで場合分けする方法まとめ

シェルスクリプトでifを使用してファイルが存在するかどうかを判定するには以下を使用します。

if [ -e ファイル名 ]; then
 処理するコマンド
fi

その他にもよく使用するオプションは以下でした。

オプション説明
-eファイルが存在する
-fファイルである
-dディレクトリである
-n文字列が0でない
-z文字列が0である
-v変数が定義されている
-rファイルが存在し、読み取り可能である
-wファイルが存在し、書き込み可能である
-xファイルが存在し、実行可能である
-hファイルが存在し、シンボリックリンクである
-sファイルが存在し、サイズが0より大きい
よく使用するシェルスクリプトテストオプション一覧

業務でも使用できるファイルが存在するかどうかで場合分けするシェルスクリプトなどを紹介しました。

#!/bin/bash

file=file_exist.txt
if [ -n "$file" ] && [ ! -e "$file" ]; then
 touch "$file"
 echo 'ファイルが存在していないので作成しました'
else
 echo 'ファイル名が空か存在しているので何もしませんでした'
fi

シェルスクリプトでifを使用してファイルが存在するかどうかで、場合分けする時に参考になると嬉しいです。

モバイルバージョンを終了