Pattern: Use of unescaped *
Issue: -
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.
Example of incorrect code:
result=$(expr 2 * 3)
Example of correct code:
# Modern, efficient, POSIX standard approach
result=$(( 2 * 3 ))
# Older, slower approach
result=$(expr 2 \* 3)