Pattern: Ineffective assignment in declare
Issue: -
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.
Example of incorrect code:
declare -i first=$1 current=$first
Example of correct code:
declare -i first=$1
declare -i current=$first