mirror of
https://github.com/koalaman/shellcheck.git
synced 2025-10-03 19:29:44 +08:00
Created SC2257 (markdown)
38
SC2257.md
Normal file
38
SC2257.md
Normal file
@@ -0,0 +1,38 @@
|
||||
## Arithmetic modifications in command redirections may be discarded. Do them separately.
|
||||
|
||||
### Problematic code:
|
||||
|
||||
```sh
|
||||
curl "$URL" > "image$((i++)).jpg"
|
||||
```
|
||||
|
||||
### Correct code:
|
||||
|
||||
```sh
|
||||
i=$((i+1))
|
||||
curl "$URL" > "image$i.jpg"
|
||||
```
|
||||
### Rationale:
|
||||
|
||||
You are using an arithmetic expression that modifies a variable, e.g. `$((x+=1))` or `$((x++))`, in the name of a file to redirect from/to, in a here document, or in a here string.
|
||||
|
||||
The scope of these modifications depends on whether the command itself will fork:
|
||||
|
||||
```sh
|
||||
echo foo > $((var++)).txt # Updates in BusyBox and Bash
|
||||
cat foo > $((var++)).txt # Updates in Busybox, not in Bash
|
||||
gcc foo > $((var++)).txt # Does not update in either
|
||||
|
||||
gcc() { /opt/usr/bin/gcc "$@"; }
|
||||
gcc foo > $((var++)).txt # Now suddenly updates in both
|
||||
```
|
||||
|
||||
Rather than rely on knowing which commands do and don't fork, or are and aren't overridden, simply do the updates in a separate command as in the correct code.
|
||||
|
||||
### Exceptions:
|
||||
|
||||
If you know your variable is scoped the way you want it, you can ignore this warning.
|
||||
|
||||
### Related resources:
|
||||
|
||||
* Help by adding links to BashFAQ, StackOverflow, man pages, POSIX, etc!
|
Reference in New Issue
Block a user