Test ([)

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

Get Shell Scripting: Expert Recipes for Linux, Bash, and More now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.