bashのファイルテスト式について質問があります。これが私の質問を説明するための簡単なスクリプトです:
set -x
read -p "Enter a filename: " var1
if [ - e $var1 ]
then
echo file exists
else
echo file not found
fi
3つのシナリオがあります。
- プロンプトで
foo
、スクリプトを実行しているディレクトリに存在するファイルであると入力します。予想どおり、出力はfile exists
です。 - プロンプトで、と入力します
bar
。スクリプトを実行しているディレクトリにそのようなファイルはありません。予想どおり、出力はfile not found
です。 - プロンプトで、
<enter>
何も入力せずにヒットしました。驚いたことに、出力はfile exists
です。
を使用する場合 if [[ -e $var1 ]]
、つまり、単一ではなく二重括弧を使用する場合、動作は正しいです。3番目の場合でも、。を取得しfile not found
ます。
set -x
何が起こっているのかを確認するために、ファイルの先頭にを貼り付け ました。角かっこが1つある場合、変数は次のように評価されます '[' -e ']'
。doubleの場合、として評価され [[ -e '' ]]
ます。これは面白い。2つのケースで式の評価が異なるのはなぜですか?
説明をいただければ幸いです。明らかなことを見逃してしまったらごめんなさい。ありがとう!