LINUX.ORG.RU

Логическая загвоздка

 ,


0

2

Доброго дня господа.
Предположим тестовый код:

#!/bin/bash

function error_handler(){
    error_value="$OPTARG"
    [ "$error_value" == "a" ] && {
        echo "err a"
        error_exit_trigger="1"
    }
    [ "$error_value" == "b" ] && {
        echo "err b"
        error_exit_trigger="1"
    }
}

while getopts ":a:b:" arg;do
    case $arg in
        "a") echo "a: $OPTARG" ;;
        "b") echo "b: $OPTARG" ;;
        :)   error_handler     ;;
    esac
done
Моделируем пару ситуаций:
$ ./script -a
err a

$ ./script -a -b
a: -b
Теперь вопрос.
Господа, может кто-то сталкивался и знает, можно ли как-то обезопасить юзера от такой вот беды, малой кровью (желательно самим же getopts'ом)?
PS: getopt поступает аналогично

Заранее спасибо адекватно ответившим.

★★★

Последнее исправление: CYB3R (всего исправлений: 1)

(желательно самим же getopts'ом)?

-b вполне может быть легитимным аргументом (скажем, -а требует имя файла)

anonymous
()
Ответ на: комментарий от anonymous

Ну, это вполне доступно для понимания.
Я о общей практике подобного. У меня есть, к примеру, точное знание что опциям не будет передано ни одного аргумента с "-" в начале.
Логично было бы организовать работу таким образом, что бы конструкция -a -b таки была охарактеризована как err a & err b. И желательно на уровне getopts, ибо иногда кол-во аргументов не малое, и делать каждому проверку на "-" в начале, а потом разгребать на что ругнуться - иногда весьма накладно.

Spirit_of_Stallman ★★★
() автор топика
Ответ на: комментарий от Spirit_of_Stallman

Тут кстати и добрый кошерный сишный getopt(3) лагает именно так же (Cравнивал так же с bash getopts и getopt(1) — поведение везде одинковое).

Т.ч. остаётся только $OPTARG на предмет начинания с даша проверять, если это так критично. Или забить.

beastie ★★★★★
()
while getopts ":a:b:" arg;do
    [[ "$OPTARG" =~ ^- ]] && echo "Error: invalid argument $OPTARG" ; exit 1
    case $arg in
        "a") echo "a: $OPTARG" ;;
        "b") echo "b: $OPTARG" ;;
        :)   error_handler     ;;
    esac
done

Будет работать в баше, если нужно что то другое рекомендую взглянуть на http://stchaz.free.fr/getopts_long

at ★★
()
Последнее исправление: at (всего исправлений: 1)
Ответ на: комментарий от beastie

Или забить

Ну, оно то так и предполагалось по началу, но мой перфекционизм загрыз меня изнутри, и я захотел узнать, как таки по красоте делать нужно :)

Spirit_of_Stallman ★★★
() автор топика
Ответ на: комментарий от at

[[ «$OPTARG» =~ ^- ]]

Да, наверно так и сделаю, предварительно добавив ключик, что отключит эту проверку, в случае если юзеру нужно будет целенаправленно передать аргумент, что попадает в блэклист.
Будет самым быстрым и малокровным решением.
Спасибо.

взглянуть на

Это весьма. Вы автор?

Spirit_of_Stallman ★★★
() автор топика
Ответ на: комментарий от Spirit_of_Stallman

добавив ключик, что отключит эту проверку

У него тоже будет параметр? Сморти в рекурсию не войди! ☺

beastie ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.