Как выйти с кодом ошибки, если в мой скрипт передано неправильное количество аргументов?

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

Я использую bash. Как я могу завершить работу с кодом ошибки, если в моем скрипте неправильное количество аргументов?

У меня есть это

#!/bin/bash

if [ "$#" -ne 3 ]; then
    echo "Должно быть три параметра для этого скрипта -- [CWD каталог-драйвера side-file]"
fi

но потом скрипт продолжается.

Вам нужно просто вызвать exit:

#!/bin/bash

if [ "$#" -ne 3 ]; then
    echo "Должно быть три параметра для этого скрипта -- [CWD каталог-драйвера side-file]" >&2
    exit 9
fi

Используя любое целое число от 1 до 255 по вашему выбору для кода выхода.

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

Вам необходимо обеспечить правильное завершение сценария Bash, если количество переданных аргументов неверное. Это важный аспект написания скриптов, поскольку некорректное количество аргументов может привести к непредсказуемому поведению программы. Рассмотрим теорию, пример и применение для решения этой задачи.

Теория

Изменение потока выполнения в скриптах Bash возможно при помощи инструкции exit. Эта команда завершает выполнение скрипта немедленно. Если вы не укажете конкретный код выхода, по умолчанию будет использован код 0, который обозначает успешное выполнение. Однако, для обозначения ошибки или ненормального завершения, необходимо использовать ненулевой код выхода в диапазоне от 1 до 255.

Подобные сценарии обычно требуют проверки количества аргументов. В Баше количество аргументов, переданных в скрипт, доступно через специальную переменную $#. Сравнивая значение этой переменной с ожидаемым количеством аргументов, можно определить корректность вызова скрипта.

Пример

Рассмотрим ваш существующий скрипт:

#!/bin/bash

if [ "$#" -ne 3 ]; then
    echo "Should be three parameters to this script -- [CWD driver-directory side-file]"
fi

Скрипт проверяет, передано ли ровно три аргумента. Если нет, он выводит сообщение об ошибке, но не завершает выполнение. Давайте добавим завершение скрипта с ненулевым кодом выхода:

#!/bin/bash

if [ "$#" -ne 3 ]; then
    echo "Should be three parameters to this script -- [CWD driver-directory side-file]" >&2
    exit 9
fi

Применение

В этом улучшенном сценарии выделяются два важных изменения:

  1. Вывод ошибки в стандартный поток ошибок. Вывод сообщения с использованием >&2 перенаправляет текст в стандартный поток ошибок, что является хорошей практикой, позволяющей отделить обычный вывод от сообщений об ошибках.

  2. Завершение скрипта с кодом ошибки. Использование exit 9 немедленно прекращает выполнение скрипта и возвращает код 9. Кодом ошибки может быть любое число от 1 до 255, и вы можете выбрать любое, кроме 0, чтобы обозначить ненормальное завершение. Это помогает системам управления вызовами или другим внешним программам диагностировать проблемы, возникающие при выполнении скрипта.

Дополнительные рекомендации

  1. Документация кода: Рекомендуется задокументировать использование кода выхода в вашем скрипте. Это особенно полезно в больших проектах, где разные коды выхода могут предназначаться для разных ошибок.

  2. Универсальность: При ошибках в других частях скрипта также нужно предусмотреть остановку с соответствующими кодами выхода.

  3. Использование функций: Для лучшей читаемости и поддержки кода, логика проверки аргументов может быть вынесена в отдельную функцию.

Например:

#!/bin/bash

check_arguments() {
    if [ "$#" -ne 3 ]; then
        echo "ERROR: Should be three parameters to this script -- [CWD driver-directory side-file]" >&2
        exit 9
    fi
}

check_arguments "$@"

# Основная логика скрипта продолжается здесь

Заключение

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

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

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