シェル スクリプトを作成するときは、ファイルが存在するかどうかに基づいて操作を実行する必要があることがよくあります。では、ファイルが存在するかどうかを確認するにはどうすればよいでしょうか?以下の記事では、test コマンドを使用して Bash にファイルやディレクトリが存在するかどうかを確認する方法を紹介しますので、ご参考になれば幸いです。
テスト コマンド
Bash では、テスト コマンドを使用してファイルが存在するかどうかを確認できます。ファイルが存在するかどうかを確認します。
test コマンドは、次のいずれかの構文形式を取ります:
test EXPRESSION [ EXPRESSION ] [[ EXPRESSION ]]
スクリプトを移植可能にしたい場合は、すべての POSIX シェルで使用できる古い test [ コマンドを使用することをお勧めします。テスト コマンド [[ (二重括弧) の新しいアップグレードされたバージョンは、デフォルト シェルとして bash、zsh、および ksh を使用するほとんどの最新システムでサポートされています。
テスト コマンドのファイル演算子
テスト コマンドには次のファイル演算子が含まれており、特定の種類のファイルをテストできます:
● -b FILE: FILE が存在し、それがブロック特殊ファイルの場合は True。
##● -c FILE: FILE が存在し、それが特殊文字ファイルの場合は True。##● -d FILE: FILE が存在し、それがディレクトリの場合は True。
##● -e FILE: タイプ (ノード、ディレクトリ、ソケットなど) に関係なく、FILE が存在し、それがファイルである場合は True。##● -f FILE: FILE が存在し、それが通常のファイル (ディレクトリやデバイスではない) の場合は True。
##● -G FILE: FILE が存在し、コマンドを実行しているユーザーと同じグループを持つ場合は True。##● -h FILE: FILE が存在し、シンボリック リンクの場合は True。
##● -g FILE: FILE が存在し、set-group-id (sgid) フラグが設定されている場合は True。##● -k FILE: FILE が存在し、スティッキー ビット フラグが設定されている場合は True。
##● -L FILE: FILE が存在し、シンボリック リンクの場合は True。##● -O FILE: FILE が存在し、コマンドを実行しているユーザーが所有している場合は True。
##● -p FILE: FILE が存在し、パイプである場合は true。##● -r FILE: FILE が存在し、読み取り可能な場合は true。
##● -S FILE: FILE が存在し、ソケットである場合は True。##● -s FILE: FILE が存在し、サイズが 0 以外の場合は True。
##● -u FILE: 存在し、set-user-id (suid) フラグが設定されている場合は True。##● -w FILE: FILE が存在し、書き込み可能な場合は true。
##● -x FILE: FILE が存在し、実行可能な場合は True。 ファイルが存在するかどうかを確認するにはどうすればよいですか? ファイルが存在するかどうかを確認する場合、最も一般的に使用される FILE 演算子は -e と -f です。最初の演算子は、ファイルの種類に関係なくファイルが存在するかどうかをチェックし、2 番目の演算子は、ファイルが通常のファイル (ディレクトリまたはデバイスではない) の場合にのみ true を返します。 ファイルが存在するかどうかを確認する場合、最も読みやすいオプションは、test コマンドを if ステートメントと組み合わせて使用することです。次のコード スニペットは、/etc/resolv.conf ファイルが存在するかどうかをチェックします:FILE=/etc/resolv.conf if test -f "$FILE"; then echo "$FILE exist" fi
FILE=/etc/resolv.conf if [ -f "$FILE" ]; then echo "$FILE exist" fi
FILE=/etc/resolv.conf if [[ -f "$FILE" ]]; then echo "$FILE exist" fi
FILE=/etc/resolv.conf if [ -f "$FILE" ]; then echo "$FILE exist" else echo "$FILE does not exist" fi
注:
名前にスペースが含まれるファイルを扱うときは、問題を避けるために常に二重引用符を使用してください。 if ステートメントを使用せずに test コマンドを使用することもできます。 && 演算子の後のコマンドは、テスト コマンドの終了ステータスが true の場合にのみ実行されます。test -f /etc/resolv.conf && echo "$FILE exist"
[ -f /etc/resolv.conf ] && echo "$FILE exist"
[[ -f /etc/resolv.conf ] && echo "$FILE exist"
[ -f /etc/resolv.conf ] && { echo "$FILE exist"; cp "$FILE" /tmp/; }
[ -f /etc/resolv.conf ] && echo "$FILE exist" || echo "$FILE does not exist"
たとえば、/etc/docker ディレクトリが存在するかどうかを確認するには、次のコマンドを使用する必要があります。
FILE=/etc/docker if [ -d "$FILE" ]; then echo "$FILE is a directory" fi
[ -d /etc/docker ] && echo "$FILE is a directory"
他の多くの言語と同様に使用できます。 (感嘆符) テスト式を否定する論理 NOT 演算子: FILE=/etc/docker
if [ ! -f "$FILE" ]; then
echo "$FILE exist and it is a directory"
fi
[ ! -f /etc/docker ] || echo "$FILE does not exist"
複数のファイルが存在するかどうかを確認するには?
複数のファイルが存在する場合、複雑なネストされた if/else 構造を使用する代わりに、-a (または &&with[]) を使用してテストできます。 以上がBash にファイルまたはディレクトリが存在するかどうかを確認する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。FILE=/etc/docker
if [ -f /etc/resolv.conf -a -f /etc/hosts ]; then
echo "$FILE is a directory"
fi
FILE=/etc/docker
if [ -f /etc/resolv.conf && -f /etc/hosts ]; then
echo "$FILE is a directory"
fi
[ -f /etc/resolv.conf -a -f /etc/hosts ] && echo "both files exist"
[[ -f /etc/resolv.conf && -f /etc/hosts ]] && echo "both files exist"
Linux チュートリアル 」上記がこの記事の全内容です。お役に立てば幸いです。皆様の学習にお役に立てれば幸いです。さらにエキサイティングなコンテンツについては、PHP 中国語 Web サイトの関連チュートリアルのコラムに注目してください。 ! !