This tutorial explains Linux “test” command, options and its usage with examples.
Test is used in conditional execution. It is used for:
1. File attributes comparisons
2. Perform string comparisons.
3. Basic arithmetic comparisons.
test exits with the status determined by EXPRESSION. Placing the EXPRESSION between square brackets ([ and ]) is the same as testing the EXPRESSION with test. To see the exit status at the command prompt, echo the value “$?” A value of 0 means the expression evaluated as true, and a value of 1 means the expression evaluated as false.
Expressions take the following forms:
|( EXPRESSION )||EXPRESSION is true|
|! EXPRESSION||EXPRESSION is false|
|EXPRESSION1 -a EXPRESSION2||both EXPRESSION1 and EXPRESSION2 are true|
|EXPRESSION1 -o EXPRESSION2||either EXPRESSION1 or EXPRESSION2 is true|
|-n STRING||the length of STRING is nonzero|
|STRING||equivalent to -n STRING|
|-z STRING||the length of STRING is zero|
|STRING1 = STRING2||the strings are equal|
|STRING1 != STRING2||the strings are not equal|
|INTEGER1 -eq INTEGER2||INTEGER1 is equal to INTEGER2|
|INTEGER1 -ge INTEGER2||INTEGER1 is greater than or equal to INTEGER2|
|INTEGER1 -gt INTEGER2||INTEGER1 is greater than INTEGER2|
|INTEGER1 -le INTEGER2||INTEGER1 is less than or equal to INTEGER2|
|INTEGER1 -lt INTEGER2||INTEGER1 is less than INTEGER2|
|INTEGER1 -ne INTEGER2||INTEGER1 is not equal to INTEGER2|
|FILE1 -ef FILE2||FILE1 and FILE2 have the same device and inode numbers|
|FILE1 -nt FILE2||FILE1 is newer (modification date) than FILE2|
|FILE1 -ot FILE2||FILE1 is older than FILE2|
|-b FILE||FILE exists and is block special|
|-c FILE||FILE exists and is character special|
|-d FILE||FILE exists and is a directory|
|-e FILE||FILE exists|
|-f FILE||FILE exists and is a regular file|
|-g FILE||FILE exists and is set-group-ID|
|-G FILE||FILE exists and is owned by the effective group ID|
|-h FILE||FILE exists and is a symbolic link (same as -L)|
|-k FILE||FILE exists and has its sticky bit set|
|-L FILE||FILE exists and is a symbolic link (same as -h)|
|-O FILE||FILE exists and is owned by the effective user ID|
|-p FILE||FILE exists and is a named pipe|
|-r FILE||FILE exists and read permission is granted|
|-s FILE||FILE exists and has a size greater than zero|
|-S FILE||FILE exists and is a socket|
|-t FD||file descriptor FD is opened on a terminal|
|-u FILE||FILE exists and its set-user-ID bit is set|
|-w FILE||FILE exists and write permission is granted|
|-x FILE||FILE exists and execute (or search) permission is granted|
1. Simple example stating use of relational operator -gt
$ test 100 -gt 99 && echo "Yes, that's true." || echo "No, that's false."
This command will print the text “Yes, that’s true.” because 100 is greater than 99.
2. This example states the use of test command along-with echoing $? i.e. last command exit status.
[ "awesome" = "awesome" ]; echo $?
This command will print “0” because the expression is true; the two strings are identical.
3. Check if a FILE exists and is a regular file
$ test -f /etc/resolv.conf && echo "File /etc/resolv.conf found." || echo "File /etc/resolv.conf not found." File /etc/resolv.conf found.
4. To test whether a file is nonexistent or empty, type the shell script:
if test ! -s "$1" then echo $1 does not exist or is empty. fi
If the file specified by the first positional parameter to the shell procedure, $1, does not exist or is of size 0, the test command displays the message. If $1 exists and has a size greater than 0, the test command displays nothing.
Note: There must be a space between the -s function and the file name.
The quotation marks around $1 ensure that the test works properly even if the value of $1 is a null string. If the quotation marks are omitted and $1 is the empty string, the test command displays the error message
test: argument expected.
5. To do a complex comparison, type the shell script:
if [ $# -lt 2 -o ! -e "$1" ] then exit fi
If the shell procedure is given fewer than two positional parameters or the file specified by $1 does not exist, then the shell procedure exits. The special shell variable $# represents the number of positional parameters entered on the command line that starts this shell procedure.
Sanfoundry Global Education & Learning Series – 1000 Linux Tutorials.