Вопрос или проблема
Существует ли способ передать более одной опции при запуске скрипта?
Мой скрипт имеет следующий случай:
case "$1" in
b)
backup_start $1
;;
h)
_usage
;;
*)
echo 'Недопустимая опция, -h для помощи'
;;
esac
Я запускаю свой скрипт с:
myscript -b backupname
Но иногда я хотел бы запустить скрипт с опцией с другим аргументом… который я затем использую в случае внутри скрипта:
myscript -b backupname -t mynewarg
Способ сделать это — использовать цикл, пока getopts
не сможет обработать аргументы:
while getopts "b:t:h" option; do
case $option in
t)
export MYINTERNALENV="$OPTARG"
;;
b)
backup_start "$OPTARG"
;;
h)
_usage
;;
?)
echo 'Недопустимая опция, -h для помощи'
;;
esac
done
Я предлагаю:
case "$1" in
-h|--help)
_usage
exit
;;
esac
backup_start $@
Ответ или решение
В современном мире информационных технологий зачастую возникает необходимость при запуске скрипта передавать в него несколько опций, чтобы расширить функциональность и гибкость его работы. В приведенной вами ситуации рассмотрим, как можно адаптировать существующий код для обработки множественных аргументов с помощью использования цикла и утилиты getopts
.
Теория
Интерпретатор bash предоставляет мощные механизмы для обработки аргументов командной строки. Одним из таких инструментов является встроенная команда getopts
, которая упрощает обработку опций. Это особенно актуально, когда нужно поддерживать как краткий, так и длинный формат опций. getopts
разобрает аргументы, переданные скрипту, и позволяет обрабатывать их в цикле, извлекая каждый аргумент и выполняя соответствующие действия.
Пример
Вы привели пример простого использования конструкции case
для обработки единственного аргумента. Однако, чтобы обработать несколько опций, каждая из которых может сопровождаться своими аргументами, рекомендуется использовать getopts
.
Рассмотрим обновленный скрипт, в который вы добавили новые опции:
while getopts "b:t:h" option; do
case $option in
t)
export MYINTERNALENV="$OPTARG"
;;
b)
backup_start "$OPTARG"
;;
h)
_usage
;;
?)
echo 'Invalid option, -h for help'
;;
esac
done
Этот код умеет разбирать опции -b
, -t
, и -h
. Каждую из них можно использовать с дополнительным аргументом (например, для опции -b
это будет имя бэкапа). getopts
сохраняет аргумент, переданный каждой опции, в переменную OPTARG
, что позволяет использовать его в теле case
.
Применение
Используя getopts
, скрипт становится более универсальным и масштабируемым. Это позволяет:
- Поддерживать множество опций и аргументов, расширяя гибкость скрипта.
- Прозрачно обрабатывать ошибки и не предусмотреть неправильные опции. Например, вы можете предложить пользователю подсказку, если он введет неправильную опцию.
- Легко интегрировать новые опции без значительных изменений в коде скрипта.
Преимущества и практические советы
-
Чистота и поддерживаемость кода: Исправление ошибок и добавление новых опций станут более простыми и быстрыми процессами.
-
Удобство для пользователя: Приложение станет более интуитивным из-за возможности предоставления четкой подсказки по использованию с помощью
-h
. -
Оптимизация: Встраивание параметров в команды может предлагать динамическое управление логикой работы скрипта, что полезно в различных сценариях, таких как автоматизация процессов.
С использованием цикла можно также учитывать более сложные структуры, такие как обязательные и необязательные аргументы, флаги и так далее. Эти характеристики подчеркивают ценность гибкости скрипта.
Заключение
Обработка аргументов командной строки является важным аспектом написания эффективных и гибких скриптов. Применяя getopts
, вы создаете скрипт, который может быть легко расширен и адаптирован к меняющимся требованиям. За счет использования циклов и суперпозиции различных функций, вы существенно повышаете удобство использования и возможность масштабирования вашего решения.
Таким образом, при правильной обработке аргументов и использовании getopts
, ваш скрипт становится эффективным инструментом, который обеспечивает многоцелевую функциональность и удовлетворяет разнообразные бизнес-требования.