シェルスクリプトで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」省略形の以下でも大丈夫です。
. シェルスクリプト名
または実行権をつけて以下でもよいです。
chmod +x シェルスクリプト名
./シェルスクリプト名
シェルスクリプトを実行するコマンドの説明は以下の記事で詳しく説明しています。
ファイルが存在する時のシェルスクリプト実行結果
シェルスクリプトを実行すると以下の結果となりました。
[root@localhost file_exist]# . file_exist.sh
ファイルは存在します
ファイルがあるので「ファイルが存在します」と表示されました。
ファイルが存在しない時のシェルスクリプト実行結果
では以下のコマンドで「file_exist.txt」を削除します。
rm -f file_exist.txt
このファイルが存在しない状態でシェルスクリプトを実行してみます。
[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_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を使用してファイルが存在するかどうかで、場合分けする時に参考になると嬉しいです。