Вы можете пропустить declare -a
для числово-индексированных массивов, но вы не можете пропустить declare -A
для ассоциативных массивов.Чтобы продемонстрировать последнее:
declare array
array[one]=1
array[two]=2
echo "${array[one]}"
... испускает:
2
Почему?Давайте используем declare -p array
, чтобы увидеть:
$ declare -p array
declare -a array='([0]="2")'
Слова one
и two
оба были приведены к числовому значению 0
, поэтому они перезаписали один и тот же ключ.
Тем не менее, declare -a array
не полный тупик.Сравните:
unset array # start from a blank slate
declare -a array
declare -p array
... испускает:
declare -a array='()'
Принимая во внимание, что если мы опускаем -a
, мы видим, что данные типа не назначены, поэтому наша переменнаяпредполагается, что это просто строка, пока она не назначена таким образом, чтобы было ясно, что это должен быть массив:
unset array # start from a blank slate
declare array
declare -p array
... испускает declare -- array=""
, если нет присвоения:
unset array # start from a blank slate
declare array
array[0]="zero"
declare -p array
... который правильно выдает declare -a array='([0]="zero")'
, что означает, что в приведенном выше коде только после строки array[0]="zero"
array
фактически становится массивом.