Expressions

Expressions are used in @, if, and while statements to perform arithmetic, string comparisons, file testing, and so on. exit and set also specify expressions, as can the tcsh built-in command filetest. Expressions are formed by combining variables and constants with operators that resemble those in the C developing language. Operator precedence is the same as in C but can be remembered as follows:

  1. * / %
  2. + -

Group all other expressions inside parentheses. Parentheses are required if the expression contains <, >, &, or |.

Operators

Operators can be one of the following types:

Assignment operators

Operator Description
= Assign value.
+= -= Reassign after addition/subtraction.
*= /= %= Reassign after multiplication/division/remainder.
&= ^= |= Reassign after bitwise AND/XOR/OR.
++ Increment.
-- Decrement.

Arithmetic operators

Operator Description
* / % Multiplication; integer division; modulus (remainder)
+ - Addition; subtraction

Bitwise and logical operators

Operator Description
~ Binary inversion (one's complement).
! Logical negation.
<< >> Bitwise left shift; bitwise right shift.
& Bitwise AND.
^ Bitwise exclusive OR.
| Bitwise OR.
&& Logical AND.
|| Logical OR.
{ command } Return 1 if command is successful, 0 otherwise. Note that this is the opposite of command's normal return code. The $status variable may be more practical.

Comparison operators

Operator Description
== != Equality; inequality
<= >= Less than or equal to; greater than or equal to
< > Less than; greater than

File inquiry operators

Command substitution and filename expansion are performed on file before the test is performed. tcsh permits operators to be combined (e.g., -ef). The following is a list of the valid file inquiry operators:

Operator Description
-d file The file is a directory.
-e file The file exists.
-f file The file is a plain file.
-o file The user owns the file.
-r file The user has read permission.
-w file The user has write permission.
-x file The user has execute permission.
-z file The file has 0 size.
! Reverse the sense of any preceding inquiry.

Some additional operators specific to tcsh are:

Operator Description
-b file The file is a block special file.
-c file The file is a character special file.
-g file The file's set-group-ID bit is set.
-k file The file's sticky bit is set.
-l file The file is a symbolic link.
-L file Apply any remaining operators to symbolic link, not the file it points to.
-p file The file is a named pipe (FIFO).
-s file The file has nonzero size.
-S file The file is a socket special file.
-t file file is a digit and is an open file descriptor for a terminal device.
-u file The file's set-user-ID bit is set.
-X file The file is executable and is in the path or is a shell built-in.

Finally, tcsh provides the following operators, which return other kinds of information:

Operator Description
-A[:] file Last time file was accessed, as the number of seconds since the Epoch. With a colon (:), the result is in timestamp format.
-C[:] file Last time inode was modified. With a colon (:), the result is in timestamp format.
-D file Device number.
-F file Composite file identifier, in the form device:inode.
-G[:] file Numeric group ID for the file. With a colon (:), the result is the group name if known; otherwise, the numeric group ID.
-I file Inode number.
-L file The name of the file pointed to by symbolic link file.
-M[:] file Last time file was modified. With a colon (:), the result is in timestamp format.
-N file Number of hard links.
-P[:] file Permissions in octal, without leading 0. With a colon (:), the result includes a leading 0.
-Pmode[:] file Equivalent to -P file ANDed to mode. With a colon (:), the result includes a leading 0.
-U[:] file Numeric user ID of the file's owner. With a colon (:), the result is the username if known, otherwise the numeric user ID.
-Z file The file's size, in bytes.

Examples

The following examples show @ commands and assume n = 4:

Expression Value of $x
@ x = ($n > 10 || $n < 5) 1
@ x = ($n >= 0 && $n < 3) 0
@ x = ($n << 2) 16
@ x = ($n >> 2) 1
@ x = $n % 2 0
@ x = $n % 3 1

The following examples show the first line of if or while statements:

Expression Meaning
while ($#argv != 0) While there are arguments . . .
if ($today[1] == <">Fri<">) If the first word is "Fri". . .
if (-f $argv[1]) If the first argument is a plain file. . .
if (! -d $tmpdir) If tmpdir is not a directory. . .