"${!array[@]}".Plus companion warning SC2303:
i is an array value, not a key. Use directly or loop over keys instead.
array=(foo bar)
for v in "${array[@]}"
do
echo "Value is ${array[$v]}"
doneEither loop over values
for v in "${array[@]}"
do
echo "Value is $v"
doneor loop over keys:
for k in "${!array[@]}" # Note `!`
do
echo "Key is $k"
echo "Value is ${array[$k]}"
doneShellCheck found a for loop over array values,
where the variable is used as an array key.
In the problematic example, the loop will print
Value is foo twice. On the second iteration,
v=bar, and bar is unset and considered zero,
so ${array[$v]} becomes ${array[bar]} becomes
${array[0]} becomes foo.
If you don't care about the key, simply loop over array values and
use $v to refer to the array value, like in the first
correct example.
If you do want the key, loop over array keys with
"${!array[@]}", use $k to refer to the array
key, and ${array[$k]} to refer to the array value.
If you do want to use values from the arrays as keys in the same array, you can ignore these messages with a directive:
declare -A fatherOf=(
["Eric Bloodaxe"]="Harald Fairhair"
["Harald Fairhair"]="Halfdan the Black"
["Halfdan the Black"]="Gudrød the Hunter"
["Gudrød the Hunter"]="Halfdan the Mild"
)
# shellcheck disable=SC2302,SC2303
for i in "${fatherOf[@]}"
do
echo "${fatherOf[$i]:-(missing)} begat $i"
doneShellCheck is a static analysis tool for shell scripts. This page is part of its documentation.