Проверьте количество аргументов, переданных Bash-скрипту
Я хотел бы, чтобы мой Bash-скрипт выводил сообщение об ошибке, если не выполнено требуемое количество аргументов.
Я пробовал следующий код:
#!/bin/bash
echo Название скрипта: $0
echo $# аргументов
if [$# -ne 1];
then echo "недопустимое количество параметров"
fi
По какой-то неизвестной причине я получаю следующую ошибку:
test: line 4: [2: команда не найдена
Что я делаю не так?
5 ответ(ов)
На StackOverflow можно ответить так:
На []: операторы !=, =, == являются операторами сравнения строк, тогда как -eq, -gt и подобные им используются для арифметических сравнений.
Я бы использовал один из следующих вариантов:
if [ "$#" != "1" ]; then
Или:
if [ $# -eq 1 ]; then
Первый вариант проверяет, что количество переданных аргументов не равно 1, используя оператор сравнения строк, а второй вариант проверяет, что количество аргументов равно 1, используя арифметический оператор.
Вы можете использовать следующую однострочную команду для проверки количества переданных параметров:
[ "$#" -ne 1 ] && ( usage && exit 1 ) || main
Эта команда разбивается на следующие шаги:
- Проверяется количество параметров (
$#
). Если оно не равно 1 (нашему ожидаемому количеству подкоманд), то выполняется следующее. - Если условие истинно, вызывается функция
usage()
и скрипт завершает работу с кодом статуса 1. - В противном случае вызывается функция
main()
.
Важно отметить:
- Функция
usage()
может быть простой и выглядеть так:echo "$0: params"
. - Функция
main()
может содержать основной код вашей программы.
Вот простая однострочная команда, которая проверяет, если передан только один параметр; в противном случае скрипт завершает свою работу:
[ "$#" -ne 1 ] && echo "ИСПОЛЬЗОВАНИЕ $0 <ПАРАМЕТР>" && exit
В данном случае, если количество аргументов не равно 1, будет выведено сообщение с инструкцией по использованию, и выполнение скрипта будет остановлено.
Ваш скрипт 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
Ваша проверка аргументов работает следующим образом:
- Функция
Help
выводит синтаксис команды при вызове. - Аргументы передаются в массив
OPTIONS
. - Производится проверка количества аргументов. Если их более четырех (включая флаги и значения), выводится сообщение об ошибке и программа завершает выполнение.
- В цикле
while
обрабатываются переданные параметры. Для каждого параметра:- Если это
--opt1
или-opt1
, считывается и выводится значение для OPT1. - Если это
--opt2
или-opt2
, считывается и выводится значение для OPT2. - Если указано
--help
, выводится справка. - В противном случае выводится сообщение об неверном параметре.
- Если это
Ваш пример использования запускает скрипт с параметрами -opt1 test --opt2 test2
, и он работает без ошибок, выводя ожидаемые результаты:
OPT1 = test
OPT2 = test2
Если у вас есть дополнительные вопросы или требуется помощь, не стесняйтесь спрашивать!
В случае, если вы хотите перестраховаться, я рекомендую использовать 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.
"Передача всех аргументов в Bash-скрипте"
Как передать все аргументы, переданные в Bash-скрипт, в мою функцию?
Ошибка "Слишком длинный список аргументов" для команд rm, cp, mv
Как работает "cat << EOF" в bash?
Передача параметров в функцию Bash