10

Проверьте количество аргументов, переданных Bash-скрипту

7

Я хотел бы, чтобы мой Bash-скрипт выводил сообщение об ошибке, если не выполнено требуемое количество аргументов.

Я пробовал следующий код:

#!/bin/bash
echo Название скрипта: $0
echo $# аргументов
if [$# -ne 1]; 
    then echo "недопустимое количество параметров"
fi

По какой-то неизвестной причине я получаю следующую ошибку:

test: line 4: [2: команда не найдена

Что я делаю не так?

5 ответ(ов)

0

На StackOverflow можно ответить так:

На []: операторы !=, =, == являются операторами сравнения строк, тогда как -eq, -gt и подобные им используются для арифметических сравнений.

Я бы использовал один из следующих вариантов:

if [ "$#" != "1" ]; then

Или:

if [ $# -eq 1 ]; then

Первый вариант проверяет, что количество переданных аргументов не равно 1, используя оператор сравнения строк, а второй вариант проверяет, что количество аргументов равно 1, используя арифметический оператор.

0

Вы можете использовать следующую однострочную команду для проверки количества переданных параметров:

[ "$#" -ne 1 ] && ( usage && exit 1 ) || main

Эта команда разбивается на следующие шаги:

  1. Проверяется количество параметров ($#). Если оно не равно 1 (нашему ожидаемому количеству подкоманд), то выполняется следующее.
  2. Если условие истинно, вызывается функция usage() и скрипт завершает работу с кодом статуса 1.
  3. В противном случае вызывается функция main().

Важно отметить:

  • Функция usage() может быть простой и выглядеть так: echo "$0: params".
  • Функция main() может содержать основной код вашей программы.
0

Вот простая однострочная команда, которая проверяет, если передан только один параметр; в противном случае скрипт завершает свою работу:

[ "$#" -ne 1 ] && echo "ИСПОЛЬЗОВАНИЕ $0 <ПАРАМЕТР>" && exit

В данном случае, если количество аргументов не равно 1, будет выведено сообщение с инструкцией по использованию, и выполнение скрипта будет остановлено.

0

Ваш скрипт Bash для обработки аргументов выглядит вполне корректно. Он позволяет передавать два параметра --opt1 и --opt2, а также их короткие формы -opt1 и -opt2. Если количество аргументов превышает четыре, скрипт выводит сообщение об ошибке и показывает инструкцию по использованию. Вот более подробное объяснение:

#!/bin/bash

Help() {
  echo "$0 --opt1|-opt1 <значение opt1> --opt2|-opt2 <значение opt2>"
}

OPTIONS=($@)
TOTAL_OPTIONS=$#
INT=0

if [ $TOTAL_OPTIONS -gt 4 ]
then
        echo "Неверное количество аргументов"
        Help
        exit 1
fi

while [ $TOTAL_OPTIONS -gt $INT ]
do
        case ${OPTIONS[$INT]} in

                --opt1 | -opt1)
                        INT=`expr $INT + 1`
                        opt1_value=${OPTIONS[$INT]}
                        echo "OPT1 = $opt1_value"
                        ;;

                --opt2 | -opt2)
                        INT=`expr $INT + 1`
                        opt2_value=${OPTIONS[$INT]}
                        echo "OPT2 = $opt2_value"
                        ;;

                --help | -help | -h)
                        Help
                        exit 0
                        ;;

                *)
                        echo "Неверный параметр - ${OPTIONS[$INT]}"
                        exit 1
                        ;;

        esac
        INT=`expr $INT + 1`
done

Ваша проверка аргументов работает следующим образом:

  1. Функция Help выводит синтаксис команды при вызове.
  2. Аргументы передаются в массив OPTIONS.
  3. Производится проверка количества аргументов. Если их более четырех (включая флаги и значения), выводится сообщение об ошибке и программа завершает выполнение.
  4. В цикле while обрабатываются переданные параметры. Для каждого параметра:
    • Если это --opt1 или -opt1, считывается и выводится значение для OPT1.
    • Если это --opt2 или -opt2, считывается и выводится значение для OPT2.
    • Если указано --help, выводится справка.
    • В противном случае выводится сообщение об неверном параметре.

Ваш пример использования запускает скрипт с параметрами -opt1 test --opt2 test2, и он работает без ошибок, выводя ожидаемые результаты:

OPT1 = test
OPT2 = test2

Если у вас есть дополнительные вопросы или требуется помощь, не стесняйтесь спрашивать!

0

В случае, если вы хотите перестраховаться, я рекомендую использовать getopts.

Вот небольшой пример:

while getopts "x:c" opt; do
  case $opt in
    c)
      echo "-$opt сработал, развернуть на ci аккаунте" >&2
      DEPLOY_CI_ACCT="true"
      ;;
    x)
      echo "-$opt сработал, Параметр: $OPTARG" >&2 
      CMD_TO_EXEC=${OPTARG}
      ;;
    \?)
      echo "Недопустимый параметр: -$OPTARG" >&2 
      Usage
      exit 1
      ;;
    :)
      echo "Параметр -$OPTARG требует аргумент." >&2 
      Usage
      exit 1
      ;;
  esac
done

Для получения дополнительных деталей вы можете ознакомиться с этой статьей: http://wiki.bash-hackers.org/howto/getopts_tutorial.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь