This assignment is used again in this declare
, but won't have taken effect. Use two declare
s.
(or local
, typeset
, readonly
, export
)
Problematic code:
declare -i first=$1 current=$first
Correct code:
declare -i first=$1
declare -i current=$first
Rationale:
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.
Exceptions:
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.
Related resources:
- Help by adding links to BashFAQ, StackOverflow, man pages, POSIX, etc!