10

Добавить новый элемент в массив в Bash без указания индекса

11

Вопрос: Как в Bash добавить элемент в массив аналогично PHP?

Есть ли способ добавить элемент в массив в Bash так же, как это делается в PHP с помощью кода <code>$array[] = 'foo';</code>?

В Bash, чтобы объявить массив и добавить элементы, мне нужно делать это явно, как в следующем примере:

array[0]='foo'
array[1]='bar'

Это довольно неудобно. Я хотел бы знать, существует ли более простой способ добавлять элементы в массив в Bash, без необходимости указывать индекс, как это делается в PHP. Спасибо!

5 ответ(ов)

0

Ваша проблема связана с тем, как вы добавляете элементы в массив в Bash. Давайте разберем код по шагам:

  1. Вы объявляете массив:

    declare -a arr
    
  2. Вы инициализируете массив с помощью одного элемента:

    arr=("a")
    
  3. Затем вы добавляете новый элемент "new" в массив, используя расширение массива:

    arr=("${arr[@]}" "new")
    

    После выполнения этой команды содержимое массива будет: a new.

  4. Вы выводите массив, и результат будет:

    echo ${arr[@]}
    

    Вывод: a new.

  5. Далее вы добавляете еще один элемент "newest":

    arr=("${arr[@]}" "newest")
    

    Теперь массив будет содержать: a new newest.

  6. Вы снова выводите массив:

    echo ${arr[@]}
    

    И получаете вывод: a new newest.

Таким образом, ваш код успешно добавляет элементы в массив и выводит его содержимое на каждом этапе. Если у вас есть дальнейшие вопросы или требуется помощь с другим кодом, дайте знать!

0

Если ваш массив всегда последовательный и начинается с 0, вы можете сделать следующее:

array[${#array[@]}]='foo'

Эта команда добавляет элемент 'foo' в конец массива. Здесь ${#array[@]} возвращает длину массива.

Если вы хотите получить длину массива, используйте:

${#array_name[@]}

Однако, если вы случайно добавите пробелы вокруг знака равенства, например:

array[${#array[@]}] = 'foo'

То получите ошибку, подобную следующей:

array_name[3]: команда не найдена

Это происходит, потому что Bash интерпретирует = как оператор присваивания, и пробел до и после него вызывает синтаксическую ошибку.

0

С индексированным массивом вы можете сделать что-то вроде этого:

declare -a a=()
a+=('foo' 'bar')

Этот код создает пустой массив a и добавляет в него элементы 'foo' и 'bar'. После выполнения этих строк массив a будет содержать два элемента.

0

Также обратите внимание на следующее:

test_array=(1 2 3 4)
test_array+=(5)
echo "${test_array[@]}"

Результат: 1 2 3 4 5

Оператор += можно использовать для добавления одного элемента или нескольких элементов в массив. Например, вы можете добавить больше элементов в массив вот так:

test_array+=(6 7 8 9)
echo "${test_array[@]}"

Результат: 1 2 3 4 5 6 7 8 9

Хочу отметить, что вы также можете удалить элемент из массива в Bash, не указывая индекс. Для этого можно использовать команду unset с значением элемента:

test_array=(1 2 3 4 5)
unset test_array[2]
echo "${test_array[@]}" 

Результат: 1 2 4 5

Будьте осторожны, когда вы удаляете элемент из массива, индексы оставшихся элементов будут автоматически скорректированы. В приведенном выше примере, когда я удалил третий элемент со значением 3, четвертый и пятый элементы стали новыми третьим и четвертым элементом соответственно.

0

Если вы используете переменные вместо жестко закодированных значений, убедитесь, что вы добавили двойные кавычки.

Ваш изначальный код работает для одиночных слов или целых чисел, но не подходит для строк, содержащих несколько слов:

array=()
avar=1
array+=($avar)

В этом случае, чтобы корректно обрабатывать строки с пробелами, вам нужно добавить кавычки вокруг переменной $avar:

array=()
avar="длинная строка с пробелами"
array+=("$avar")

Использование кавычек гарантирует, что значения, содержащие пробелы, будут интерпретироваться как одно целое.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь