mirror of
https://github.com/koalaman/shellcheck.git
synced 2025-10-03 19:29:44 +08:00
Created SC2304 (markdown)
30
SC2304.md
Normal file
30
SC2304.md
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
## `*` must be escaped to multiply: `\*`. Modern `$((x * y))` avoids this issue.
|
||||||
|
|
||||||
|
### Problematic code:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
result=$(expr 2 * 3)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Correct code:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Modern, efficient, POSIX standard approach
|
||||||
|
result=$(( 2 * 3 ))
|
||||||
|
|
||||||
|
# Older, slower approach
|
||||||
|
result=$(expr 2 \* 3)
|
||||||
|
```
|
||||||
|
### Rationale:
|
||||||
|
|
||||||
|
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!
|
Reference in New Issue
Block a user