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


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

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

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

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

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

Код: Bash
  1.  
  2.  
  3. while getopts ":ulain:f:hv" opt ;
  4. do
  5.     case $opt in
  6.         n) user=$OPTARG;
  7.            echo $user
  8.             #write_to_file
  9.             ;;
  10.         f) file=$OPTARG;
  11.            testing;
  12.             ;;
  13.         v) echo -n $version
  14.             ;;
  15.         .......
  16.         *) echo "Неправильный параметр";
  17.             echo "Для вызова справки запустите $ME -h";
  18.             exit 1
  19.             ;;
  20.         esac
  21. done
  22.  

так вот суть проблемы в том что, при запуске влияет порядок указания ключа, а мне необходимо сделать так что был ключ -n отрабатывал первым а уже все остальные ключе отрабатывали после него.
Сейчас получается что если я запускаю скрипт так:
Код: Bash
  1. script -n Test -f /home/user/data.txt -ai

то все нормально, а вот если вот так:
Код: Bash
  1. script -aif /home/user/data.txt -n Test

то получают проблему, так как ключи a и i зависят от ключа n но он еще не отработал, и аргумент ключа n еще не известен.
Как заставить getopts отрабатывать сначала ключ n а потом все остальные при чем не важно в каком порядке ключ n указан. Спасибо
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

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

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

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

  • Автор темы
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3474
  • nix - вот оно счастье...
    • Просмотр профиля
Re: bash аргументы запуска скрипта.
« Ответ #2 : 10 Август 2014, 14:17:43 »
т.е. до цикла в ручном режиме пропарсить ключи и присвоить переменной значение ключа n? Я правильно тебя понял  или ты что-то другое имел ввиду?
Если просто присвоить переменной, то сути это не поменяет:
Код: Bash
  1. while getopts ":ulain:f:hv" opt ;
  2. do
  3.     case $opt in
  4.         n) user=$OPTARG;;
  5.         f) file=$OPTARG;
  6.            testing;
  7.             ;;
  8.         v) echo -n $version
  9.             ;;
  10.         *) echo "Неправильный параметр";
  11.             echo "Для вызова справки запустите $ME -h";
  12.             exit 1
  13.             ;;
  14.         esac
  15. done
  16.  
  17.  
« Последнее редактирование: 10 Август 2014, 14:22:51 от Чистый »
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

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

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

Оффлайн M1ke

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

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

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

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

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

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

  • Автор темы
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3474
  • nix - вот оно счастье...
    • Просмотр профиля
Re: bash аргументы запуска скрипта.
« Ответ #7 : 11 Август 2014, 13:43:51 »
Короче тупол через getopts получил все опции, и дальше по скрипту проверял какой ключ был указан, на этом и стою логику скрипта, но вот возник другой вопрос, в скрипте использую поиск в AD от M$, для этого использую программу ldapsearch, но тут вылез косяк, запускаю так:
Код: Bash
  1. 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
  2.  

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

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6014
  • 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 »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

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

  • Автор темы
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3474
  • 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.258 секунд. Запросов: 24.