Флаг -a необходим для создания массива bash? - PullRequest
0 голосов
/ 01 декабря 2018

Какова дополнительная ценность объявления массива bash с флагом -a, как показано ниже:

с флагом

declare -a arr1
arr1[0]="array1-zero"
arr1[1]="array1-one"
echo ${arr1[0]}
echo ${arr1[1]}

... при поведенииТо же самое, если вы опустите опцию, как показано ниже:

без опции -a

declare arr2
arr2[0]="array2-zero"
arr2[1]="array2-one"
echo ${arr2[0]}
echo ${arr2[1]}

То же самое касается ассоциативных массивов (опция -A).Пропуск этого дает тот же результат, что и его предоставление.

1 Ответ

0 голосов
/ 01 декабря 2018

Вы можете пропустить 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 фактически становится массивом.

...