多くの場合、シェルスクリプトを作成するときに、ファイルが存在するかどうかに基づいてアクションを実行する必要がある状況に陥る可能性があります。
Bashでは、testコマンドを使用して、ファイルが存在するかどうかを確認し、ファイルの種類を判別できます。
テストコマンドは、次の構文形式のいずれかを取ります。
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]
スクリプトを移植可能にする場合は、古いテスト[を使用することをお勧めします。 コマンド。すべてのPOSIXシェルで使用できます。テストコマンドの新しいアップグレードバージョン[[ (二重括弧)は、デフォルトのシェルとしてBash、Zsh、およびKshを使用する最新のシステムでサポートされています。
ファイルが存在するかどうかを確認する#
ファイルが存在するかどうかを確認する場合、最も一般的に使用されるFILE演算子は-eです。 および-f 。 1つ目は、タイプに関係なくファイルが存在するかどうかを確認し、2つ目は、FILEが通常のファイル(ディレクトリやデバイスではない)の場合にのみtrueを返します。
ファイルが存在するかどうかを確認するときに最も読みやすいオプションは、testを使用することです。 ifと組み合わせたコマンド 声明。以下のスニペットはいずれも、/etc/resolv.confかどうかを確認します。 ファイルが存在します:
FILE=/etc/resolv.conf
if test -f "$FILE"; then
echo "$FILE exists."
fi
FILE=/etc/resolv.conf
if [ -f "$FILE" ]; then
echo "$FILE exists."
fi
FILE=/etc/resolv.conf
if [[ -f "$FILE" ]]; then
echo "$FILE exists."
fi
ファイルが存在するかどうかに基づいて異なるアクションを実行する場合は、単にif / then構文を使用します:
FILE=/etc/resolv.conf
if [ -f "$FILE" ]; then
echo "$FILE exists."
else
echo "$FILE does not exist."
fi
名前に空白を含むファイルを処理するときの問題を回避するために、常に二重引用符を使用してください。
ifステートメントなしでtestコマンドを使用することもできます。 &&の後のコマンド 演算子は、テストコマンドの終了ステータスがtrueの場合にのみ実行されます
test -f /etc/resolv.conf && echo "$FILE exists."
[ -f /etc/resolv.conf ] && echo "$FILE exists."
[[ -f /etc/resolv.conf ]] && echo "$FILE exists."
&&の後に一連のコマンドを実行する場合 演算子は、コマンドを;で区切った中括弧で囲むだけです。 または&& :
[ -f /etc/resolv.conf ] && { echo "$FILE exist."; cp "$FILE" /tmp/; }
&&の反対側 、||の後のステートメント 演算子は、テストコマンドの終了ステータスがfalseの場合にのみ実行されます。 。
[ -f /etc/resolv.conf ] && echo "$FILE exist." || echo "$FILE does not exist."
演算子-d ファイルがディレクトリであるかどうかをテストできます。
たとえば、/etc/dockerかどうかを確認します 使用するディレクトリが存在します:
FILE=/etc/docker
if [ -d "$FILE" ]; then
echo "$FILE is a directory."
fi
[ -d /etc/docker ] && echo "$FILE is a directory."
二重角かっこを使用することもできます[[ 単一のものではなく[ 。
ファイルが存在しないかどうかを確認する#
他の多くの言語と同様に、テスト式は!を使用して無効にすることができます。 (感嘆符)論理否定演算子:
FILE=/etc/docker
if [ ! -f "$FILE" ]; then
echo "$FILE does not exist."
fi
上記と同じ:
[ ! -f /etc/docker ] && echo "$FILE does not exist."
複数のファイルが存在するかどうかを確認する#
複雑なネストされたif/else構造を使用する代わりに、-aを使用できます。 (または&& [[ )複数のファイルが存在するかどうかをテストするには:
if [ -f /etc/resolv.conf -a -f /etc/hosts ]; then
echo "Both files exist."
fi
if [[ -f /etc/resolv.conf && -f /etc/hosts ]]; then
echo "Both files exist."
fi
IFステートメントを使用しない同等のバリアント:
[ -f /etc/resolv.conf -a -f /etc/hosts ] && echo "Both files exist."
[[ -f /etc/resolv.conf && -f /etc/hosts ]] && echo "Both files exist."
ファイルテスト演算子#
testコマンドには、特定の種類のファイルをテストできる次のFILE演算子が含まれています。
-
-bFILE-FILEが存在し、特別なブロックファイルである場合はTrue。 -
-cFILE-FILEが存在し、特殊文字ファイルである場合はTrue。 -
-dFILE-ファイルが存在し、ディレクトリである場合はTrue。 -
-eFILE-タイプ(ノード、ディレクトリ、ソケットなど)に関係なく、FILEが存在し、ファイルである場合はTrue。 -
-fFILE-FILEが存在し、通常のファイル(ディレクトリやデバイスではない)の場合はTrue。 -
-GFILE-FILEが存在し、コマンドを実行しているユーザーと同じグループを持っている場合はTrue。 -
-hFILE-ファイルが存在し、シンボリックリンクである場合はTrue。 -
-gFILE-ファイルが存在し、set-group-id(sgidがある場合)はTrue )フラグが設定されています。 -
-kFILE-ファイルが存在し、スティッキービットフラグが設定されている場合はTrue。 -
-LFILE-ファイルが存在し、シンボリックリンクである場合はTrue。 -
-OFILE-ファイルが存在し、コマンドを実行しているユーザーが所有している場合はTrue。 -
-pFILE-ファイルが存在し、パイプである場合はTrue。 -
-rFILE-ファイルが存在し、読み取り可能である場合はTrue。 -
-SFILE-ファイルが存在し、ソケットである場合はTrue。 -
-sFILE-ファイルが存在し、サイズがゼロ以外の場合はTrue。 -
-uFILE-FILEが存在する場合はtrue、set-user-id(suid)フラグが設定されています。 -
-wFILE-ファイルが存在し、書き込み可能である場合はTrue。 -
-xFILE-ファイルが存在し、実行可能である場合はTrue。
結論#
このガイドでは、ファイルまたはディレクトリがBashに存在するかどうかを確認する方法を示しました。
ご質問やご意見がございましたら、お気軽にコメントをお寄せください。