Skip to content
Vidar Holen edited this page Aug 23, 2021 · 2 revisions

* must be escaped to multiply: \*. Modern $((x * y)) avoids this issue.

Problematic code:

result=$(expr 2 * 3)

Correct code:

# Modern, efficient, POSIX standard approach
result=$(( 2 * 3 ))

# Older, slower approach
result=$(expr 2 \* 3)

Rationale:

ShellCheck found an expr command whose operator is an unescaped asterisk *.

When using expr, each argument is expanded the same way as for any other command. This means that expr 2 * 3 will turn into expr 2 Desktop Documents Downloads Music Pictures 3 depending on the files in the current directory, causing an error like expr: syntax error: unexpected argument ‘Desktop’

The best way to avoid this is to avoid expr and instead use $((..)) instead. If you for any reason prefer the 200x slower, heavyweight process of forking a new process, you can escape the *. Both ways are demonstrated in the correct example.

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 S001. Use GitHub "Pages" feature above to find a specific one, or see Checks.

Clone this wiki locally