Skip to content
Maddison Hellstrom edited this page Feb 10, 2020 · 3 revisions

Variable was used as an array but is now assigned a string.

Problematic code:

flags[0]="-r"
flags[1]="--delete-after"

if [ "$dryrun" ]
then
   flags="--dry-run"
fi

Correct code:

flags[0]="-r"
flags[1]="--delete-after"

if [ "$dryrun" ]
then
   flags=( "--dry-run" )
fi

Rationale:

ShellCheck noticed that you have used a variable as an array, but then assign it a string. array=foo is equivalent to array[0]=foo, and leaves the rest of the elements unaffected.

In the incorrect code, "${flags[@]}" would contain --dry-run --delete-after.

To set an array to only a single, given element, you should use array=( foo ).

In the correct code, "${flags[@]}" will contain --dry-run only.

Another possible cause is accidentally missing the $ on a previous assignment: var=(my command); var=bar instead of var=$(my command); var=bar. If the variable is not intended to be an array, ensure that it's never assigned as one.

Exceptions:

ShellCheck can get confused by variable scope if the same variable name was used as an array previously, but is a string in the current context. You can ignore it in this case.

In the case of local variables, a workaround is to declare the local variable separately from assigning to it:

Problematic Code:

foo () {
   local -a baz
   baz+=("foo" "bar")
   echo "${baz[@]}"
}

bar () {
   local baz="qux"
   echo "$baz"
}

Correct Code:

foo () {
   local -a baz
   baz+=("foo" "bar")
   echo "${baz[@]}"
}

bar () {
   local baz
   baz="qux"
   echo "$baz"
}

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