シェルスクリプト `if [ -s hoge.txt ]; then` の意味

疑問

下記のシェルスクリプトに出会ったが意味がわからなかったので調査しました。

if [ -s hoge.txt ]; then
    rm hoge.txt
fi

調査結果

このシェルスクリプトは、hoge.txt というファイルが存在し、かつサイズが0より大きい(空でない)場合に、そのファイルを削除する役割を果たします。以下、各行の詳細な説明です。

  1. if [ -s hoge.txt ]; thenhoge.txt というファイルが存在し、サイズが0より大きいかどうかを確認します。s オプションは、ファイルが存在し、かつサイズが0より大きい場合に真となります。
  2. rm hoge.txt:条件が真の場合に実行されるコマンドです。hoge.txt コマンドは、hoge.txt というファイルを削除します。
  3. fiif ステートメントの終わりを示します。

このシェルスクリプトは、hoge.txt ファイルが存在し、サイズが0より大きい場合に、そのファイルを削除する目的で使用されます。これは、例えばテストの結果をログに記録する前に古いログをクリアするために役立ちます。

補足

if [ -s file ] のような条件式は、ファイルの存在とそのサイズが0より大きいことを確認するために使われることがあります。ただし、スクリプトの目的や要件によっては、他の条件もよく使われます。以下に、よく使われるファイルに関する条件オプションをいくつか紹介します。

  1. e file:ファイルが存在する場合に真となります。 例:if [ -e test_log.txt ]; then
  2. f file:ファイルが存在し、通常のファイルである場合に真となります。 例:if [ -f test_log.txt ]; then
  3. d file:ファイルが存在し、ディレクトリである場合に真となります。 例:if [ -d test_directory ]; then
  4. r file:ファイルが存在し、読み取り可能である場合に真となります。 例:if [ -r test_log.txt ]; then
  5. w file:ファイルが存在し、書き込み可能である場合に真となります。 例:if [ -w test_log.txt ]; then
  6. x file:ファイルが存在し、実行可能である場合に真となります。 例:if [ -x script.sh ]; then

スクリプトの目的に応じて、これらの条件オプションを使い分けることが一般的です。-s オプションは、特定のケースで有用ですが、他のオプションと同様に、スクリプトの要件に応じて適切に使用されます。

参考

ChatGPTさんにききました。