Именованные аргументы в сценарии Bash

Давайте признаем, что использование позиционных аргументов, таких как $1 и $2 для ваших аргументов не очень описательно и не очень гибко. Есть лучший способ предоставления аргументов: с помощью этого простого трюка вы получите --именованные аргументы -в вашем скрипте, что намного лучше 🤓.

Разбор аргументов скрипта

Следующий скрипт разбирает все аргументы и превращает их в переменные:

while [ $# -gt 0 ]; do
    if [[ $1 == "--"* ]]; then
        v="${1/--/}"
        declare "$v"="$2"
        shift
    fi
    shift
done

echo "$this: '$this' $a: '$a'"
Войти в полноэкранный режим Выйти из полноэкранного режима

Когда мы выполняем скрипт с: ./test.sh --this is --a test, он возвращает:

$this: 'is' $a: 'test'
Войти в полноэкранный режим Выйти из полноэкранного режима

Примечание: этот метод не очень строгий, он может пропустить параметры, которые не придерживаются формата двойного тире. Если вы хотите поддерживать —single-parameters, проверьте Support for —help?

Примечание 2: этот метод не работает с set -u 🤷.

Проверка аргументов

Сначала давайте определим функцию usage, чтобы показать, как работает наш скрипт:

programname=$0
function usage {
    echo ""
    echo "Deploys an ECR image to Atlas using GitOps and ArgoCD."
    echo ""
    echo "usage: $programname --service_name string --tag string --atlas string --env string "
    echo ""
    echo "  --service_name string   name of the service"
    echo "                          (example: blaze-search-term-redirect-service)"
    echo "  --tag string            tag of the image to deploy"
    echo "                          (example: 804-a325d6a)"
    echo "  --namespace string      namespace of the cluster"
    echo "                          (example: eos)"
    echo "  --env string            env to which to deploy the tag"
    echo "                          (example: dev)"
    echo ""
}
Вход в полноэкранный режим Выход из полноэкранного режима

Далее определим функцию die:

function die {
    printf "Script failed: %snn" "$1"
    exit 1
}
Вход в полноэкранный режим Выход из полноэкранного режима

Теперь проверим, переданы ли параметры. Если один из параметров отсутствует, выведем сообщение об использовании и завершим скрипт. Мы используем условное выражение -z, чтобы проверить, пуста ли переменная:

if [[ -z $service_name ]]; then
    usage
    die "Missing parameter --service_name"
elif [[ -z $tag ]]; then
    usage
    die "Missing parameter --tag"
elif [[ -z $namespace ]]; then
    usage
    die "Missing parameter --namespace"
elif [[ -z $env ]]; then
    usage
    die "Missing parameter --env"
fi
Войти в полноэкранный режим Выйти из полноэкранного режима

Поддержка команды —help?

Самый простой способ добавить --help в ваш скрипт, это добавить его в цикл, который превращает аргументы в переменные:

while [ $# -gt 0 ]; do
    if [[ $1 == "--help" ]]; then
        usage
        exit 0
    elif [[ $1 == "--"* ]]; then
        v="${1/--/}"
        declare "$v"="$2"
        shift
    fi
    shift
done
Войти в полноэкранный режим Выйти из полноэкранного режима

В этот цикл можно добавить любой единичный параметр.

Как насчет значений по умолчанию?

Здесь у вас есть 2 стратегии:

  1. Объявить переменные в верхней части сценария и инициализировать их значениями по умолчанию.
  2. Использовать расширение параметров: my_parameter=${my_parameter:-default value}.

Расширение параметров

Если вы используете расширение параметров, вам необходимо знать, что пустая строка "" также будет заменена. Обратите внимание на следующий сценарий:

my_parameter="${my_parameter:-default value}"
printf "%snn" "$my_parameter"
Вход в полноэкранный режим Выйти из полноэкранного режима

Это приведет к следующему результату:

$ ./test.sh
default value

$ ./test.sh --my_parameter "my value"
my value

$ ./test.sh --my_parameter ""
default value

Вход в полноэкранный режим Выйти из полноэкранного режима

Таким образом, настройки по умолчанию в верхней части скрипта — мое предпочтение.

Пишите лучшие скрипты: используйте ShellCheck

В статье Пожалуйста, перестаньте писать сценарии оболочки есть несколько отличных моментов о том, почему написание сценария bash сложно для программистов: поведение bash, скорее всего, не похоже на язык программирования, с которым вы знакомы. Расширение ShellCheck для Visual Studio Code поможет вам уловить некоторые подводные камни. При каждом «нарушении» оно дает ссылку на статью в Вики для обучения:

Показать объяснение SC2086.

Заключение

Добавлять именованные аргументы в сценарий bash довольно просто. Есть некоторые оговорки, поскольку вы можете «переопределить» аргументы в своем скрипте извне. Если вы объявите аргументы в начале сценария и сбросите параметры после секции while, вы уменьшите этот риск.

Changelog

2022-04-04: скрипт проверки параметров стал немного короче благодаря использованию elif.

Оцените статью
devanswers.ru
Добавить комментарий