Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: bash аргументы запуска скрипта.  (Прочитано 1726 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Чистый

  • Автор темы
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
bash аргументы запуска скрипта.
« : 10 Августа 2014, 13:13:50 »
Добрый, пишу скрипт, у скрипта есть ключи, организовал из через getopts

Код: (bash) [Выделить]


while getopts ":ulain:f:hv" opt ;
do
    case $opt in
        n) user=$OPTARG;
   echo $user
            #write_to_file
            ;;
f) file=$OPTARG;
   testing;
            ;;
        v) echo -n $version
            ;;
        .......
        *) echo "Неправильный параметр";
            echo "Для вызова справки запустите $ME -h";
            exit 1
            ;;
        esac
done

так вот суть проблемы в том что, при запуске влияет порядок указания ключа, а мне необходимо сделать так что был ключ -n отрабатывал первым а уже все остальные ключе отрабатывали после него.
Сейчас получается что если я запускаю скрипт так:
Код: (bash) [Выделить]
script -n Test -f /home/user/data.txt -ai
то все нормально, а вот если вот так:
Код: (bash) [Выделить]
script -aif /home/user/data.txt -n Test
то получают проблему, так как ключи a и i зависят от ключа n но он еще не отработал, и аргумент ключа n еще не известен.
Как заставить getopts отрабатывать сначала ключ n а потом все остальные при чем не важно в каком порядке ключ n указан. Спасибо
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Оффлайн Дмитрий Бо

  • Погонщик серверов
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 3549
  • Я не техподдержка, я за порядком слежу
    • Просмотр профиля
Re: bash аргументы запуска скрипта.
« Ответ #1 : 10 Августа 2014, 13:29:30 »
не пиши логику на этот кейс, а только определяй переменные.

Оффлайн Чистый

  • Автор темы
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
Re: bash аргументы запуска скрипта.
« Ответ #2 : 10 Августа 2014, 14:17:43 »
т.е. до цикла в ручном режиме пропарсить ключи и присвоить переменной значение ключа n? Я правильно тебя понял  или ты что-то другое имел ввиду?
Если просто присвоить переменной, то сути это не поменяет:
Код: (bash) [Выделить]
while getopts ":ulain:f:hv" opt ;
do
    case $opt in
        n) user=$OPTARG;;
f) file=$OPTARG;
   testing;
            ;;
        v) echo -n $version
            ;;
        *) echo "Неправильный параметр";
            echo "Для вызова справки запустите $ME -h";
            exit 1
            ;;
        esac
done

« Последнее редактирование: 10 Августа 2014, 14:22:51 от Чистый »
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Оффлайн Дмитрий Бо

  • Погонщик серверов
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 3549
  • Я не техподдержка, я за порядком слежу
    • Просмотр профиля
Re: bash аргументы запуска скрипта.
« Ответ #3 : 10 Августа 2014, 14:55:17 »
Сначала этим кейсом разбираешь все аргументы, а потом, когда они уже разобраны, начинаешь что-то делать. Если ты говоришь, что a и i зависят от n, то покажи эти a и i, тогда можно будет сказать конкретнее.

Оффлайн M1ke

  • Участник
  • *
  • Сообщений: 228
  • ✎…
    • Просмотр профиля
    • IT блог
Re: bash аргументы запуска скрипта.
« Ответ #4 : 10 Августа 2014, 15:36:33 »
Принимаешь все значения. Далее если n существует ввполняешь необходимое, и при условии существования же n проверяешь, есть ли а и i, если есть а и i то выполняешь действия (т.к. n проверен и он точно есть), и при условии что это ок все - создаешь заглушку z и если даллее в коде нужно делать что-то в зависимости от существования и после выполнение а и i то проверяешь, труе ли заглушкаь- если труе - ввполняешь, если нет - то не выполняешь (или что-то другое делаешь - в зависимости от потребностей). Не нужно переносить логику работы в логику инициализации.
define(TRUE, FALSE); //секс и наркотики

Оффлайн Чистый

  • Автор темы
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
Re: bash аргументы запуска скрипта.
« Ответ #5 : 10 Августа 2014, 17:37:42 »
Ну сначала получить ключи а потом строить логику на их основании это вариант, но все же думается мне что можно как-то приоритет выставить.
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Оффлайн Дмитрий Бо

  • Погонщик серверов
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 3549
  • Я не техподдержка, я за порядком слежу
    • Просмотр профиля
Re: bash аргументы запуска скрипта.
« Ответ #6 : 10 Августа 2014, 18:02:30 »
Чистый, зачем и костыли. "Приоритеты" усложнят простой и понятный механизм, а какая от них польза — даже  не представляю.

Оффлайн Чистый

  • Автор темы
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
Re: bash аргументы запуска скрипта.
« Ответ #7 : 11 Августа 2014, 13:43:51 »
Короче тупол через getopts получил все опции, и дальше по скрипту проверял какой ключ был указан, на этом и стою логику скрипта, но вот возник другой вопрос, в скрипте использую поиск в AD от M$, для этого использую программу ldapsearch, но тут вылез косяк, запускаю так:
Код: (bash) [Выделить]
ldapsearch -D $root@company.loc -w $pwdroot -LLL -H $host -b $bind_dn -P 3 -a always "(cn=$user)" $listattribyt | perl -p00e 's/\r?\n //g' |grep -v "^#" |sed '/^$/d' |tr -d " " &> $tmp

вероятнее всего, количество pipe можно уменьшить, но пока это не главное, проблема в том что если указать не верный пароль от учетки доступа к AD то ldapsearch выплевывает все в stdin не глядя на то что указано все пихать в файл ($tmp переменная хранит путь к файлу), как это исправить ума не приложу.
« Последнее редактирование: 11 Августа 2014, 13:46:36 от Чистый »
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: bash аргументы запуска скрипта.
« Ответ #8 : 11 Августа 2014, 15:17:48 »
Ошибка идет в stderr, который не передается через pipe, посему перехватить его надо сразу 2>&1, перед pipe.
И что это за страшный разбор и perl, и grep, и sed, и tr — на чём-то одном бы остановились…
И кстати
-o ldif-wrap=no
отключает перенос вообще
« Последнее редактирование: 11 Августа 2014, 15:40:49 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Чистый

  • Автор темы
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
Re: bash аргументы запуска скрипта.
« Ответ #9 : 11 Августа 2014, 15:51:26 »
Azure,
-o ldif-wrap=no у меня лично не работает, т.е. ldapsearch вываливает справку при добавлении этого ключа. вероятнее всего его надо обновлять до последней версии что бы это заработало, сейчас у меня 2.4.23. последняя 2.4.39. касательно pipe спасибо, попробую.
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

 

Страница сгенерирована за 0.048 секунд. Запросов: 25.