*must be escaped to multiply:
$((x * y))avoids this issue.
result=$(expr 2 * 3)
# 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
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.