Как я могу управлять длинными списками пакетов в sh без массивов?

Вопрос или проблема

Я использую FreeBSD, а оболочка – “sh”. Я хочу создать простой скрипт для установки списка пакетов. Обычно я использовал бы массив для хранения имен пакетов, но поскольку “sh” не поддерживает массивы, я думаю, что лучшим решением будет использовать строку с именами, разделенными пробелами, вот так:

packages="nameofpackage1 nameofpackage2 nameofpackage3"

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

Я думаю, будет лучше перечислить пакеты в виде “списка”. Это упростит добавление новых пакетов, просто добавив новую строку. Однако, как я понимаю, это означает, что мне нужно будет использовать символ \ для продолжения строки. Если пакетов много, будет много символов \. Вызывает ли это проблемы для sh?

packages="package_a \
          package_b \
          package_c \
          package_d \
          и так далее"

Есть ли лучший способ это сделать? Если у вас есть какие-либо предложения, я был бы очень признателен.

Используйте список позиционных параметров:

set -- \
    package_a \
    package_b \
    package_c \
    package_d

Вы можете ссылаться на список, используя "$@".

Вы можете перебрать пакеты с помощью

for package do
    # сделать что-то с "$package"
done

Проблема с преобразованием списка пакетов в одну строку заключается в том, что для использования отдельных имен пакетов в циклах или для выполнения любых операций с ними, вам необходимо (позволить оболочке) разделить строку. Это может быть приемлемо в простых случаях, когда имена пакетов не содержат пробелов или символов глобов, но как только вам потребуется иметь дело с такими вещами, как curl 8.* или подобные подстроки, действия по разделению и глобам в оболочке будет сложно выполнить правильно во всех случаях.

Ответ или решение

Чтобы эффективно управлять длинными списками пакетов в оболочке "sh", не используя массивы, вы можете воспользоваться несколькими подходами, которые помогут упростить написание и поддержание вашего сценария. Этот ответ рассмотрит альтернативные методы, включая использование позиционных параметров и разбиения строк, что значительно упростит управление вашими пакетами.

Решение с использованием позиционных параметров

Одним из самых удобных способов работы с длинными списками пакетов в "sh" является использование позиционных параметров. Для этого вы можете воспользоваться командой set, которая позволяет установить список значений, доступных через $1, $2, и так далее. Примерно это будет выглядеть следующим образом:

set -- \
    package_a \
    package_b \
    package_c \
    package_d

Здесь каждой строке соответствует один пакет. Данная конструкция позволяет легко добавлять новые пакеты, просто добавляя их на новую строку. При этом вы можете управлять списком удобным и читаемым способом.

Использование переменной "$@"

После того как вы установили позиционные параметры, вы можете сослаться на них, используя "$@". Это будет предоставлять доступ ко всем пакетам в вашем сценарии. Например, вы можете итерировать по списку пакетов следующим образом:

for package in "$@"; do
    echo "Устанавливаем пакет: $package"
    # Здесь вы можете вставить команду для установки пакета
done

Преимущества данного подхода

  1. Читаемость: Код остается структурированным и хорошо читаемым, что облегчает дальнейшую работу.
  2. Легкость в изменении: Чтобы добавить новый пакет, достаточно вставить его в список, не беспокоясь о порядке или длине строк.
  3. Избежание проблем с пробелами: Вы не сталкиваетесь с проблемами, связанными с разбиением строк на пробелы, как это могло бы быть при использовании одной строки для хранения всех пакетов.

Разбиение строк

Если вы всё же предпочитаете хранить пакеты в одной строке, делая их многострочными, вы можете использовать символ \ для продолжения строки. Это допустимо в "sh" и в большинстве POSIX-сопоставимых оболочек:

packages="package_a \
          package_b \
          package_c \
          package_d"

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

Заключение

Использование позиционных параметров в "sh" — это не только более удобный, но и безопасный способ управления длинными списками пакетов без использования массивов. Этот метод позволяет вам легко добавлять, изменять и итерировать пакеты, не беспокоясь о проблемах, которые могут возникнуть при разбиении строк или работе с пробелами. Таким образом, ваш сценарий остается чистым и структурированным, что в конечном итоге упрощает его поддержку и развитие.

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

Капча загружается...