Skip to content
Vidar Holen edited this page Aug 23, 2021 · 1 revision

'expr' expects 3+ arguments but sees 1. Make sure each operator/operand is a separate argument, and escape <>&|.

Problematic code:

# | not escaped
expr 1 | 2
# > not escaped
expr "$foo" >= "$bar"

# Missing spaces around +
expr 1+2
# Unexpected quoting around an expression
expr "1 + 2"

Correct code:

expr 16 \| 7
expr "$foo" \>= "$bar"
expr 1 + 2

Rationale:

ShellCheck found an expr command with 1 or 2 arguments. expr normally expects 3 or more.

Generally, this happens for one of two reasons:

  • You are using an operator like |, &, >, >=, <, <=, which needs to be escaped to avoid the shell interpreting it as a pipe, backgrounded command, or redirection.
  • You don't have spaces around operators and operands (or have bad quotes) which causes them not to be separate arguments.

Make sure each operator or operand to expr is a separate argument, and that anything containing shell metacharacters is escaped. The correct code shows examples of each.

Exceptions:

None

Related resources:

  • Help by adding links to BashFAQ, StackOverflow, man pages, POSIX, etc!

ShellCheck

Each individual ShellCheck warning has its own wiki page like SC1000. Use GitHub Wiki's "Pages" feature above to find a specific one, or see Checks.

Clone this wiki locally