---
name: "expr"
section: "1"
platform: "openbsd"
package: "man"
version: "8.0-current-20261101"
release: "OpenBSD 8.0-current (2026-11-01)"
platforms: ["linux", "freebsd", "openbsd", "macos"]
url: "https://new.carta.tech/expr"
---

# expr(1)

evaluate expression

## NAME

**expr** – evaluate expression

## SYNOPSIS

**expr** *expression* *...*

## DESCRIPTION

The **expr** utility evaluates each *expression* and writes the result on standard output. All operators are separate arguments to the **expr** utility. Characters special to the command interpreter must be escaped.

Operators are listed below in order of increasing precedence. Operators with equal precedence are grouped within { } symbols.

- *expr1* \| *expr2*

  Returns the evaluation of *expr1* if it is neither an empty string nor zero; otherwise, returns the evaluation of *expr2*.

- *expr1* & *expr2*

  Returns the evaluation of *expr1* if neither expression evaluates to an empty string or zero; otherwise, returns zero.

- *expr1* {=, \>, \>=, \<, \<=, !=} *expr2*

  Returns the results of integer comparison if both arguments are decimal integers; otherwise, returns the results of string comparison using the locale-specific collation sequence. The result of each comparison is 1 if the specified relation is true, or 0 if the relation is false.

- *expr1* {+, -} *expr2*

  Returns the results of addition or subtraction of decimal integer-valued arguments.

- *expr1* {\*, /, %} *expr2*

  Returns the results of multiplication, integer division, or remainder of decimal integer-valued arguments.

- *expr1* : *expr2*

  The ‘:’ operator matches *expr1* against *expr2*, which must be a basic regular expression. The regular expression is anchored to the beginning of the string with an implicit ‘^’.

  If the match succeeds and the pattern contains at least one regular expression subexpression “\\(...\\)”, the string corresponding to “\\1” is returned; otherwise, the matching operator returns the number of characters matched. If the match fails and the pattern contains a regular expression subexpression the null string is returned; otherwise, returns 0.

  Note: the empty string cannot be matched using

  ```
  expr '' : '$'
  ```

  This is because the returned number of matched characters (zero) is indistinguishable from a failed match, so **expr** returns failure (0). To match the empty string, use a structure such as:

  ```
  expr X'' : 'X$'
  ```

Parentheses are used for grouping in the usual manner.

## EXIT STATUS

The **expr** utility exits with one of the following values:

- 0

  The expression is neither an empty string nor 0.

- 1

  The expression is an empty string or 0.

- 2

  The expression is invalid.

- 2

  An error occurred (such as memory allocation failure).

## EXAMPLES

Add 1 to the variable *a*:

```
$ a=`expr $a + 1`
```

Return the filename portion of a pathname stored in variable *a*. The ‘//’ characters act to eliminate ambiguity with the division operator:

```
$ expr "//$a" : '.*/\(.*\)'
```

Return the number of characters in variable *a*:

```
$ expr $a : '.*'
```

## SEE ALSO

[test(1)](/test/1.md), [re\_format(7)](/re_format/7.md)

## STANDARDS

The **expr** utility is compliant with the IEEE Std 1003.1-2008 (“POSIX.1”) specification.

## HISTORY

The **expr** utility first appeared in the Programmer's Workbench (PWB/UNIX) and has supported regular expressions since Version 7 AT&T UNIX. It was rewritten from scratch for 386BSD-0.1 and again for NetBSD 1.1.

## AUTHORS

The first free version was written by Pace Willisson in 1992. This version was written by John T. Conklin in 1994.
