koalaman / shellcheck Public
SC2304
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!