このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。
Linuxコマンドの基本:シェルスクリプトのファイル属性の評価

シェルスクリプトのファイル属性の評価
シェルスクリプトでは、ファイルやディレクトリの存在や属性を評価するための演算子が多数用意されています。これらの演算子を使用することで、ファイルの有無や種類、パーミッションなどを判定し、条件に応じた処理を実行することができます。ここでは、よく使われるファイル属性の評価演算子について解説します。

ファイル属性に関する評価演算子
以下に、代表的なファイル属性の評価演算子をまとめます。
演算子 | 意味 |
---|---|
-e file | file が存在する。 |
-d file | file が存在し、ディレクトリである。 |
-h file | file が存在し、シンボリックリンクである。 |
-L file | file が存在し、シンボリックリンクである(-h と同じ)。 |
-f file | file が存在し、通常のファイルである。 |
-r file | file が存在し、読み取りパーミッションが与えられている。 |
-w file | file が存在し、書き込みパーミッションが与えられている。 |
-x file | file が存在し、実行パーミッションが与えられている。 |
file1 -nt file2 | file1 の変更時刻が file2 より新しい。 |
file1 -ot file2 | file1 の変更時刻が file2 より古い。 |
例1:ログディレクトリの存在確認
次のシェルスクリプトでは、シェル変数 logdir
で指定したログディレクトリが存在するかを -d
演算子で確認し、存在しない場合にはエラーメッセージを表示します。
スクリプトの作成
user01@ubuntu:~$ nano log-dir.sh
log-dir.sh
の内容
#!/bin/bash
logdir="/Logs"
if [ -d "$logdir" ]; then
echo "ログディレクトリは: $logdir"
else
echo "[ERROR] ログディレクトリが見つかりません: $logdir"
fi
解説
logdir="/Logs"
:ログディレクトリのパスを変数logdir
に代入しています。if [ -d "$logdir" ]; then
:-d
演算子で$logdir
が存在し、ディレクトリであるかを確認しています。- 条件が真の場合:ログディレクトリのパスを表示します。
- 条件が偽の場合:エラーメッセージを表示します。
実行権限の付与
user01@ubuntu:~$ chmod +x log-dir.sh
スクリプトの実行
user01@ubuntu:~$ ./log-dir.sh
[ERROR] ログディレクトリが見つかりません: /Logs
解説
/Logs
ディレクトリが存在しないため、条件が偽となりelse
ブロックのエラーメッセージが表示されます。
例2:ファイルの読み取り・書き込みパーミッションの確認
次のシェルスクリプトでは、指定したファイルが存在し、読み取りおよび書き込みパーミッションがあるかを確認します。
スクリプトの作成
user01@ubuntu:~$ nano check-permission.sh
check-permission.sh
の内容
#!/bin/bash
filename="$1"
if [ -e "$filename" ]; then
echo "ファイル '$filename' は存在します。"
if [ -r "$filename" ]; then
echo "読み取り可能です。"
else
echo "読み取り不可です。"
fi
if [ -w "$filename" ]; then
echo "書き込み可能です。"
else
echo "書き込み不可です。"
fi
else
echo "ファイル '$filename' は存在しません。"
fi
解説
filename="$1"
:コマンドライン引数で指定されたファイル名を変数filename
に代入します。if [ -e "$filename" ]; then
:-e
演算子でファイルの存在を確認します。- ファイルが存在する場合:
-r
演算子で読み取りパーミッションを確認します。-w
演算子で書き込みパーミッションを確認します。- ファイルが存在しない場合:エラーメッセージを表示します。
実行権限の付与
user01@ubuntu:~$ chmod +x check-permission.sh
スクリプトの実行例
1.存在するファイルを指定
テスト用のファイルを作成します。
user01@ubuntu:~$ touch testfile.txt
パーミッションを設定します。
user01@ubuntu:~$ chmod 644 testfile.txt
スクリプトを実行します。
user01@ubuntu:~$ ./check-permission.sh testfile.txt
ファイル 'testfile.txt' は存在します。
読み取り可能です。
書き込み可能です。
testfile.txt
は存在し、読み取り・書き込みパーミッションが与えられています。
2.存在しないファイルを指定
user01@ubuntu:~$ ./check-permission.sh nonexist.txt
ファイル 'nonexist.txt' は存在しません。
解説
nonexist.txt
は存在しないため、存在しない旨のメッセージが表示されます。
3.読み取り不可のファイルを指定
パーミッションを変更します。
user01@ubuntu:~$ chmod 200 testfile.txt
スクリプトを再度実行します。
user01@ubuntu:~$ ./check-permission.sh testfile.txt
ファイル 'testfile.txt' は存在します。
読み取り不可です。
書き込み可能です。
解説
testfile.txt
の読み取りパーミッションを外し、書き込みパーミッションのみ与えています。- スクリプトの結果、読み取り不可であることが確認できます。
不要になったファイルの削除
作成したシェルスクリプトとファイルを削除します。
user01@ubuntu:~$ rm log-dir.sh check-permission.sh testfile.txt
まとめ
- ファイル属性の評価演算子を使用することで、ファイルやディレクトリの存在、種類、パーミッションなどを判定できます。
-e
、-d
、-f
、-r
、-w
、-x
などの演算子を活用して、条件に応じた処理を実装できます。- 例1では、ログディレクトリの存在を確認し、存在しない場合にエラーメッセージを表示するスクリプトを作成しました。
- 例2では、ファイルの存在と読み取り・書き込みパーミッションを確認するスクリプトを作成しました。
これらの機能を組み合わせることで、シェルスクリプトの柔軟性と信頼性を高めることができます。