Bash Scripting

Эффективный возврат массивов из функций Bash

Spread the love

Bash не поддерживает прямое возвращение массивов из функций. Однако, этого можно достичь, используя хитрые приёмы. В этой статье рассматриваются два эффективных метода: использование подстановки команд и манипулирование внутренним разделителем полей (IFS).

Оглавление

Подстановка команд

Подстановка команд захватывает вывод команды и присваивает его переменной. Это составляет основу нашего первого метода. Ключ в том, чтобы отформатировать вывод функции для лёгкого разбора обратно в массив.

Возврат массивов с помощью подстановки команд

Этот метод включает в себя объединение элементов массива в строку с помощью разделителя, а затем разделение строки обратно на массив. Давайте рассмотрим пример:


my_array_function() {
  local array=("apple" "banana" "cherry")
  local delimiter="|"
  echo "${array[*]}" | tr ' ' 'n' | paste -sd"$delimiter" -
}

returned_string=$(my_array_function)
returned_array=(${returned_string//|$delimiter/ })

echo "Возвращённый массив: ${returned_array[@]}"

Вот как это работает:

  1. my_array_function создаёт локальный массив.
  2. Он использует echo, tr для замены пробелов на новые строки и paste для объединения элементов с разделителем.
  3. Подстановка команд захватывает вывод в returned_string.
  4. Развертывание параметров заменяет разделитель на пробелы для создания массива returned_array.

Этот подход прост и эффективен, но разделитель не должен присутствовать в элементах массива. Если он есть, рассмотрите использование менее распространённого символа или более надёжного метода обработки разделителей.

Возврат массивов с помощью IFS

Внутренний разделитель полей (IFS) управляет тем, как Bash разделяет строки на слова. Мы можем использовать это для возврата массивов, установив IFS внутри функции и напечатав элементы массива. Вызывающий скрипт затем использует изменённый IFS для анализа вывода.


my_array_function() {
  local array=("apple" "banana" "cherry")
  local old_ifs="$IFS"
  IFS=$'n'
  printf "%sn" "${array[@]}"
  IFS="$old_ifs"
}

returned_array=($(my_array_function))

echo "Возвращённый массив: ${returned_array[@]}"

Пояснение:

  1. my_array_function сохраняет текущий IFS.
  2. Он устанавливает IFS в символ новой строки.
  3. Он печатает каждый элемент массива на новой строке.
  4. Он восстанавливает IFS.
  5. Вызывающий скрипт использует новую строку в качестве разделителя для создания массива.

Этот метод чище, если ваши элементы массива не содержат новых строк. Для элементов, содержащих новые строки, вам нужно выбрать другой, менее вероятный символ IFS.

Выбор лучшего метода

Оба метода предлагают жизнеспособные решения. Лучший выбор зависит от ваших конкретных потребностей и содержимого массива. Подход с подстановкой команд предлагает большую гибкость в выборе разделителя, в то время как использование IFS может быть чище, если ваши данные позволяют это. Всегда отдавайте предпочтение чистому, надёжному и хорошо закомментированному коду.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *