Какова дополнительная ценность объявления массива 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). Пропуск его дает тот же результат, что и его предоставление.
Привет, согласно сайту проекта документации Linux, оба пути верны и равны. Что предпочтительнее - решать вам. tldp.org/LDP/abs/html/arrays.html
@KrassiEm, ABS печально известна плохими практиками в своих примерах - это то же самое, что bash, что W3Schools для JavaScript. Значительно внимательнее обслуживаются Вики по баш-хакерам и БашГид.
Пропуск declare -A для ассоциативных массивов, в частности, является ошибкой очень - ваши ключи приводятся к числам, поэтому обычно все они занимают позицию 0.
@KrassiEm, ... чтобы поговорить с упомянутой дурной славой - см. Временные метки (в эпоху UNIX) в записи фактоида "abs" в чат-боте для irc.freenode.org #bash channel в wooledge.org/~greybot/meta/abs; вы увидите, что ABS не рекомендуют использовать этот канал с начала 2008 года, то есть уже более десяти лет.
-a - это не ассоциативные массивы, это индексированные массивы, которые используются по умолчанию для bash. Вот почему примеры OP одинаковы.
@Gox, я думаю, ОП это уже знает - поэтому они говорят только с ассоциативными массивами при обсуждении -A.



Вы можете пропустить 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 фактически становится массивом.
Очень ясно. Таким образом, TL; DR заключается в том, что массивы будут приведены к правильному типу, а ассоциативные массивы - нет. Из любопытства: какую версию bash вы используете? Я не получаю вывод «declare -a array = '()'», а скорее «declare -a array» при вызове declare -p array
Я получаю declare -a array на bash 4.4.23 и declare -a array='()' на bash 3.2.57.
Для ассоциативных массивов попробуйте использовать «foo» и «bar» вместо 0 и 1.