*
must be escaped to multiply: \*
. Modern
$((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 *
.
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.
None
ShellCheck is a static analysis tool for shell scripts. This page is part of its documentation.