Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bash, confusing results for different file tests (test -f)

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?

like image 458
befire Avatar asked Aug 01 '12 13:08

befire


1 Answers

It's because the empty expansion of $var is removed before test sees it. You are actually running test -f and thus there's only one arg to test, namely -f. According to POSIX, a single arg like -f is true because it is not empty.

From POSIX test(1) specification:

1 argument:
Exit true (0) if `$1` is not null; otherwise, exit false.

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".

like image 131
Jens Avatar answered Oct 20 '22 16:10

Jens