SC2318 – ShellCheck Wiki

See this page on GitHub


This assignment is used again in this declare, but won't have taken effect. Use two declares.

(or local, typeset, readonly, export)

Problematic code:

declare -i first=$1 current=$first

Correct code:

declare -i first=$1
declare -i current=$first


When assigning variables via a command, such as declare, typeset, local etc, the expansion of all arguments happen before all assignments. This means that you can't have a variable assigned and then referenced in the same command.

In the example, if $1 is 42, the arguments will first be expanded in the current environment into -i first=42 current=. They will then be passed to declare which will perform the assignments.

To correctly set current=$first so that it uses the new value of first, use two separate commands as shown.

Note that this only applies when assigning via commands, because arguments are always expanded before commands are invoked. If assigning without a command, as in first=$1 current=$first, it will work as expected.


If you want to reference the value as it existed before the command, e.g. if swapping variables with declare x=$y y=$x, you can ignore this message. However, consider rewriting it anyways for the benefit of any humans reading the code.

ShellCheck is a static analysis tool for shell scripts. This page is part of its documentation.