Created SC2304 (markdown)

Vidar Holen
2021-08-22 20:00:31 -07:00
parent 8aee464617
commit 0c60c81382

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!