244 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
			
		
		
	
	
			244 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
| .TH EXPR 1
 | |
| .SH NAME \"	Copyright (C) 1989 by Kenneth Almquist.
 | |
| expr, test, [ \- evaluate expressions
 | |
| .SH SYNOPSIS
 | |
| .B expr
 | |
| .I expression
 | |
| .br
 | |
| .B test
 | |
| .I expression
 | |
| .br
 | |
| .B [
 | |
| .I expression
 | |
| .B ]
 | |
| .SH DESCRIPTION
 | |
| .B Expr
 | |
| evaluates the expression and prints the result.
 | |
| .B Test
 | |
| evaluates the expression without printing the result.
 | |
| The ``[''
 | |
| command is a synonym for
 | |
| .BR test ;
 | |
| when invoked under this name
 | |
| the last argument to
 | |
| .B expr
 | |
| must be a ``]'', which is deleted and not considered part of the expression.
 | |
| .PP
 | |
| Three data types may occur in the
 | |
| .IR expression :
 | |
| string, integer, and boolean.
 | |
| The rules for conversion are as follows:
 | |
| .sp
 | |
| .nr i 2
 | |
| .ta \nii
 | |
| .in +\nii
 | |
| .ti -\nii
 | |
| \fIstring\fR\->\fIinteger\fR	Done via
 | |
| .BR atoi (3).
 | |
| .ti -\nii
 | |
| \fIinteger\fR\->\fIstring\fR	Convert to decimal representation.
 | |
| .ti -\nii
 | |
| \fIstring\fR\->\fIboolean\fR	"" \-> false, everything else to true.
 | |
| .ti -\nii
 | |
| \fIboolean\fR\->\fIstring\fR	false \-> "", true \-> "true".
 | |
| .ti -\nii
 | |
| \fIinteger\fR\->\fIboolean\fR	0 \-> false, everything else to true.
 | |
| .ti -\nii
 | |
| \fIboolean\fR\->\fIinteger\fR	false \-> 0, true \-> 1.
 | |
| .in -\nii
 | |
| .PP
 | |
| Any argument to
 | |
| .B expr
 | |
| which is not a legal operator is treated as a string operand of type
 | |
| .BR string .
 | |
| .PP
 | |
| As a special case, if
 | |
| .I expression
 | |
| is omitted, the result is false.
 | |
| .PP
 | |
| We now list the operators.  The syntax
 | |
| .sp
 | |
| .ti +8
 | |
| \fIinteger\fB op \fIinteger\fR \-> \fIboolean\fB (3)\fR
 | |
| .sp
 | |
| means that \fBop\fR is a binary operator which takes operands of type
 | |
| \fIinteger\fR and produces a result of type \fIboolean\fR.
 | |
| The ``(3)'' means that the priority of \fBop\fR is 3.
 | |
| Operands are automatically converted to the appropriate type.  The type
 | |
| \fIany\fR is used for operator that take operands of any type.
 | |
| .nr p 1
 | |
| .de b
 | |
| .TP 0.5i
 | |
| \fI\\$1\fB \\$2 \fI\\$3\fR \-> \\fI\\$4\\fR  (\\np)
 | |
| ..
 | |
| .de u
 | |
| .TP 0.5i
 | |
| \\$1 \fI\\$2\fR \-> \\fI\\$3\\fR  (\\np)
 | |
| ..
 | |
| .b any \-o any any
 | |
| Returns the value of the left hand operand if the left hand operand
 | |
| would yield
 | |
| .B true
 | |
| if converted to type
 | |
| .BR boolean ,
 | |
| and the value of the right hand operand otherwise.
 | |
| The right hand operand is evaluated only if necessary.
 | |
| ``|'' is a synonym for ``\-o''.
 | |
| .nr p \np+1
 | |
| .b any -a any any
 | |
| Returns the value of the left hand operand if the left hand operand
 | |
| would yield
 | |
| .B false
 | |
| if converted to type
 | |
| .BR boolean ,
 | |
| and the value of the right hand operand otherwise.
 | |
| The right hand operand is evaluated only if necessary.
 | |
| ``&'' is a synonym for ``\-a''.
 | |
| .nr p \np+1
 | |
| .u ! boolean boolean
 | |
| Returns true if the operand is false, and false if the operand is true.
 | |
| .nr p \np+1
 | |
| .b string = string boolean
 | |
| True if the two strings are equal.
 | |
| .b string != string boolean
 | |
| True if the two strings are not equal.
 | |
| .b integer \-eq integer boolean
 | |
| True if the two operands are equal.
 | |
| .b integer \-ne integer boolean
 | |
| True if the two operands are not equal.
 | |
| .b integer \-gt integer boolean
 | |
| True if the first operand is greater than the second one.
 | |
| .b integer \-lt integer boolean
 | |
| True if the first operand is less than the second one.
 | |
| .b integer \-ge integer boolean
 | |
| True if the first operand is greater than or equal to the second one.
 | |
| .b integer \-le integer boolean
 | |
| True if the first operand is less than or equal to the second one.
 | |
| .nr p \np+1
 | |
| .b integer + integer integer
 | |
| Add two integers.
 | |
| .b integer \- integer integer
 | |
| Subtract two integers.
 | |
| .nr p \np+1
 | |
| .b integer * integer integer
 | |
| Multiply two integers.  ``*'' is special to the shell, so you generally
 | |
| have to write this operator as ``\e*''.
 | |
| .b integer / integer integer
 | |
| Divide two integers.
 | |
| .b integer % integer integer
 | |
| Returns the remainder when the first operand is divided by the second one.
 | |
| .nr p \np+1
 | |
| .b string : string "integer or string"
 | |
| The second operand is interpreted as a regular expression (as in the
 | |
| System V
 | |
| .B ed
 | |
| program).
 | |
| This operator attempts to match part (or all) of the first operand
 | |
| with the regular expression.  The match must start at the beginning of
 | |
| the first operand.
 | |
| If the regular expression contains \e( \e) pairs, then the result
 | |
| of this operator is the string which is matched by the regular expression
 | |
| between these pairs, or the null string if no match occurred.  Otherwise,
 | |
| the result is the number of characters matched by the regular expression,
 | |
| or zero if no no match occurred.
 | |
| .nr p \np+1
 | |
| .u \-n string integer
 | |
| Returns the number of characters in the string.
 | |
| .u \-z string boolean
 | |
| Returns true if the string contains zero characters.
 | |
| .u \-t integer boolean
 | |
| Returns true if the specified file descriptor is associated with a tty.
 | |
| .PP
 | |
| The remaining operators all deal with files.  Except as noted, they return
 | |
| false if the
 | |
| specified file does not exist.  The ones dealing with permission use
 | |
| the effective user and group ids of the shell.
 | |
| .u \-r string boolean
 | |
| True if you have read permission on the file.
 | |
| .u \-w string boolean
 | |
| True if you have write permission on the file.
 | |
| .u \-x string boolean
 | |
| True if you have execute permission on the file.
 | |
| .u \-f string boolean
 | |
| True if the file is a regular file.
 | |
| .u \-d string boolean
 | |
| True if the file is a directory.
 | |
| .u \-c string boolean
 | |
| True if the file is a character special file.
 | |
| .u \-b string boolean
 | |
| True if the file is a block special file.
 | |
| .u \-p string boolean
 | |
| True if the file is a named pipe (i.e. a fifo).
 | |
| .u \-u string boolean
 | |
| True if the file is setuid.
 | |
| .u \-g string boolean
 | |
| True if the file is setgid.
 | |
| .u \-k string boolean
 | |
| True if the file has the sticky bit set.
 | |
| .u \-s string "integer or boolean"
 | |
| Returns the size of the file, or 0 if the file does not exist.
 | |
| .u \-h string boolean
 | |
| True if the file is a symlink.  This is the only file test operator that
 | |
| does not follow symlinks, all others do.  So ``\-d'' and ``\-h''
 | |
| are both true on a symlink pointing to a directory.
 | |
| ``\-L'' is a synonym for ``\-h''.
 | |
| .SH "EXIT CODE"
 | |
| 0 if the result of 
 | |
| .I expression
 | |
| would be
 | |
| .B true
 | |
| if the result were converted to
 | |
| .BR boolean .
 | |
| .br
 | |
| 1 if the result of 
 | |
| .I expression
 | |
| would be
 | |
| .B false
 | |
| if the result were converted to
 | |
| .BR boolean .
 | |
| .br
 | |
| 2 if
 | |
| .I expression
 | |
| is syntactically incorrect.
 | |
| .SH EXAMPLES
 | |
| .TP 0.5i
 | |
| filesize=`expr \-s file`
 | |
| Sets the shell variable
 | |
| .I filesize
 | |
| to the size of
 | |
| .IR file .
 | |
| .TP 0.5i
 | |
| if [ \-s file ]; then command; fi
 | |
| Execute
 | |
| .I command
 | |
| if
 | |
| .I file
 | |
| exists and is not empty.
 | |
| .TP 0.5i
 | |
| x=`expr "$x" : '.\\{4\\}\\(.\\{0,3\\}\\)'`
 | |
| Sets
 | |
| .I x
 | |
| to the substring of
 | |
| .I x
 | |
| beginning after the fourth character of
 | |
| .I x
 | |
| and continuing for three characters or until the end of the string,
 | |
| whichever comes first.
 | |
| .TP 0.5i
 | |
| x=`expr X"$x" : X'.\\{4\\}\\(.\\{0,3\\}\\)'`
 | |
| This example is the same as the previous one, but it uses a leading
 | |
| ``X'' to make things work when the value of
 | |
| .I x
 | |
| looks like an operator.
 | |
| .SH BUGS
 | |
| The relational operators of the System V
 | |
| .B expr
 | |
| command are not implemented.
 | |
| .PP
 | |
| Certain features of this version of
 | |
| .B expr
 | |
| are not present in System V, so care should be used when writing
 | |
| portable code.
 | |
| .SH COPYRIGHT
 | |
| Kenneth Almquist.
 | 
