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

Clone this wiki locally