The first example in this chapter used the -r test to see if a file exists and is readable. That is a useful test for that example, but there are many more, all documented in the test man page. There is no point in repeating the entire test man page here; rather, look at some useful techniques for getting the best out of test, and selecting the most appropriate test for the task at hand. With so many to choose from, it is common to see shell scripts that go out of their way to replicate the features of test, simply because the writer did not know how useful test can be.
First, let’s admit to the sneaky way in which test is implemented, which explains the spacing rules mentioned at the start of this chapter. test itself is a program, which is usually implemented as a shell builtin command. So although there normally is a /usr/bin/test on the disk, it does not usually get called because the shell’s builtin is found first. Another name for test is [. When [ is called, it requires a ] around its arguments, but otherwise, it does the same work.
$ type test test is a shell builtin $ type [ [ is a shell builtin $ which test /usr/bin/test $ which [ /usr/bin/[ $ ls -il /usr/bin/test /usr/bin/[ 33625 -rwxr-xr-x 1 root root 33064 Apr 28 2010 /usr/bin/[ 33634 -rwxr-xr-x 1 root root 30136 Apr 28 2010 /usr/bin/test
This example shows that if you call test or [ from bash, you will get bash’s implementation of these. On the disk, you also have test and [ which are very similarly ...