Skip to content
Vidar Holen edited this page Feb 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:

  • Help by adding links to BashFAQ, StackOverflow, man pages, POSIX, etc!

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