Необходим ли флаг -a для создания массива bash?

Какова дополнительная ценность объявления массива 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). Пропуск его дает тот же результат, что и его предоставление.

Для ассоциативных массивов попробуйте использовать «foo» и «bar» вместо 0 и 1.

that other guy 01.12.2018 19:39

Привет, согласно сайту проекта документации Linux, оба пути верны и равны. Что предпочтительнее - решать вам. tldp.org/LDP/abs/html/arrays.html

Krassi Em 01.12.2018 20:05

@KrassiEm, ABS печально известна плохими практиками в своих примерах - это то же самое, что bash, что W3Schools для JavaScript. Значительно внимательнее обслуживаются Вики по баш-хакерам и БашГид.

Charles Duffy 01.12.2018 21:16

Пропуск declare -A для ассоциативных массивов, в частности, является ошибкой очень - ваши ключи приводятся к числам, поэтому обычно все они занимают позицию 0.

Charles Duffy 01.12.2018 21:17

@KrassiEm, ... чтобы поговорить с упомянутой дурной славой - см. Временные метки (в эпоху UNIX) в записи фактоида "abs" в чат-боте для irc.freenode.org #bash channel в wooledge.org/~greybot/meta/abs; вы увидите, что ABS не рекомендуют использовать этот канал с начала 2008 года, то есть уже более десяти лет.

Charles Duffy 01.12.2018 21:27
-a - это не ассоциативные массивы, это индексированные массивы, которые используются по умолчанию для bash. Вот почему примеры OP одинаковы.
user5550963 01.12.2018 21:36

@Gox, я думаю, ОП это уже знает - поэтому они говорят только с ассоциативными массивами при обсуждении -A.

Charles Duffy 01.12.2018 21:42
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
4
7
158
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете пропустить 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

smizzlov 13.12.2018 13:48

Я получаю declare -a array на bash 4.4.23 и declare -a array='()' на bash 3.2.57.

Charles Duffy 13.12.2018 17:30

Другие вопросы по теме