Вопрос или проблема
Я использую 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
Преимущества данного подхода
- Читаемость: Код остается структурированным и хорошо читаемым, что облегчает дальнейшую работу.
- Легкость в изменении: Чтобы добавить новый пакет, достаточно вставить его в список, не беспокоясь о порядке или длине строк.
- Избежание проблем с пробелами: Вы не сталкиваетесь с проблемами, связанными с разбиением строк на пробелы, как это могло бы быть при использовании одной строки для хранения всех пакетов.
Разбиение строк
Если вы всё же предпочитаете хранить пакеты в одной строке, делая их многострочными, вы можете использовать символ \
для продолжения строки. Это допустимо в "sh" и в большинстве POSIX-сопоставимых оболочек:
packages="package_a \
package_b \
package_c \
package_d"
Однако стоит отметить, что такой метод может привести к путанице в будущем, особенно если необходимо будет работать с пакетами, содержащими пробелы или специальные символы.
Заключение
Использование позиционных параметров в "sh" — это не только более удобный, но и безопасный способ управления длинными списками пакетов без использования массивов. Этот метод позволяет вам легко добавлять, изменять и итерировать пакеты, не беспокоясь о проблемах, которые могут возникнуть при разбиении строк или работе с пробелами. Таким образом, ваш сценарий остается чистым и структурированным, что в конечном итоге упрощает его поддержку и развитие.