Difference between 'if -e' and 'if -f'
$ man bash
-e file
True if file exists.
-f file
True if file exists and is a regular file.
A regular file is something that isn't a directory, symlink, socket, device, etc.
The if statement actually uses the program 'test' for the tests. You could write if statements two ways:
if [ -e filename ];
or
if test -e filename;
If you know this, you can easily check the man page for 'test' to find out the meanings of the different tests:
man test
See: http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html
I believe those aren't "if switches", rather "test switches" (because you have to use them inside [] brackets.
But the difference is:
[ -e FILE ]
True if FILE exists.
This will return true for both /etc/hosts
and /dev/null
and for directories.
[ -f FILE ]
True if FILE exists and is a regular file.
This will return true for /etc/hosts
and false for /dev/null
(because it is not a regular file), and false for /dev
since it is a directory.
-e
checks for any type of filesystem object; -f
only checks for a regular file.