Skip to content
Rafael Cepeda edited this page Jul 18, 2020 · 2 revisions

Arithmetic modifications in command redirections may be discarded. Do them separately.

Problematic code:

curl "$URL" > "image$((i++)).jpg"

Correct code:

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:

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:

ShellCheck

Each individual ShellCheck warning has its own wiki page like SC1000. Use GitHub Wiki's "Pages" feature above to find a specific one, or see Checks.

Clone this wiki locally