I am confused in bash by this expression:
$ var="" # empty var
$ test -f $var; echo $? # test if such file exists
0 # and this file exists, amazing!
$ test -f ""; echo $? # let's try doing it without var
1 # and all ok
I can't understand such bash behaviour, maybe anybody can explain?
When
var
is empty,$var
will behave differently when if quoted or not.So this example tells us: we should quote the
$var
.It's because the empty expansion of
$var
is removed beforetest
sees it. You are actually runningtest -f
and thus there's only one arg totest
, namely-f
. According to POSIX, a single arg like-f
is true because it is not empty.From POSIX test(1) specification:
There's never a test for a file with an empty file name. Now with an explicit
test -f ""
there are two args and-f
is recognized as the operator for "test existence of path argument".