SC2304 – ShellCheck Wiki

See this page on GitHub


* 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)


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.



ShellCheck is a static analysis tool for shell scripts. This page is part of its documentation.