The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]



"Парсинг смешанного порядка аргументов функций"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

"Парсинг смешанного порядка аргументов функций"  +/
Сообщение от universite (ok), 02-Фев-19, 23:39 
Имеется Дебиановский баш и функция вида:

site_create <domain name> [ipv4=<ipv4 address>] [ipv6=<ipv6 address>] [<template>]

Порядок аргументов [ipv4=<ipv4 address>] [ipv6=<ipv6 address>] [<template>] может быть разный.

Пока сделал черновик:


site_create() {
    local CONFIG_TEMPLATE="default"

    if [[ -z "$1" ]]
    then
         echo -e "${COLOR_RED}Failure.${FORMAT_END} Please specify a site name."
         exit 1
    fi

    # todo $3 and $4
    if [[ ! -z "$2" ]] && [[ -z "$3" ]] && [[ -z "$4" ]]
    then
         local CONFIG_TEMPLATE="$2"
    else
        if test; then
              echo error;
        fi

    fi

    for arg in $2 $3 $4 ;
    do
        local localARGv4=$(echo $arg | awk -F= '/^ipv4=/{print $2;}')
        local localARGv6=$(echo $arg | awk -F= '/^ipv6=/{print $2;}')
        if [[ ! -z "$localARGv4" ]]
        then
            Ipv4=$localARGv4
        fi
        if [[ ! -z "$localARGv6" ]]
        then
            Ipv6=$localARGv6
        fi
    done
    ...

}

Если строгий порядок, то проще.
А со смешанным порядком - хз как определять...

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по ответам | RSS]

1. "Парсинг смешанного порядка аргументов функций"  +/
Сообщение от михалыч (ok), 03-Фев-19, 17:31 
> Если строгий порядок, то проще.
> А со смешанным порядком - хз как определять...

ну так ведь уже и определил
в правильно заданном вопросе - содержится уже половина ответа


#!/bin/sh

while [ $# -ne 0 ] ; do

    if [ $(echo $1 | awk -F= '{print $1}') = ipv4 ] ; then
        v4=$(echo $1 | awk -F= '{print $2}')
    elif [ $(echo $1 | awk -F= '{print $1}') = ipv6 ] ; then
        v6=$(echo $1 | awk -F= '{print $2}')
    else
        site=$1
    fi

    shift

done


echo ip4=$v4
echo ip6=$v6
echo domain=$site

./test.sh "ipv6=2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d" "ipv4=192.168.1.1" "dom.com"

ip4=192.168.1.1
ip6=2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d
domain=dom.com


что там в четвёртом аргументе зашито, что за шаблон, я не знаю
пусть это будет "домашкой"

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Парсинг смешанного порядка аргументов функций"  +/
Сообщение от universite (ok), 03-Фев-19, 22:42 
>[оверквотинг удален]
> echo ip4=$v4
> echo ip6=$v6
> echo domain=$site
>
> ./test.sh "ipv6=2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d" "ipv4=192.168.1.1" "dom.com"
> ip4=192.168.1.1
> ip6=2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d
> domain=dom.com
> что там в четвёртом аргументе зашито, что за шаблон, я не знаю
> пусть это будет "домашкой"

спс.
Домашка будет разобраться с оператором shift.

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Парсинг смешанного порядка аргументов функций"  –1 +/
Сообщение от universite (ok), 04-Фев-19, 05:05 
>[оверквотинг удален]
>     shift
> done
> echo ip4=$v4
> echo ip6=$v6
> echo domain=$site
>
> ./test.sh "ipv6=2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d" "ipv4=192.168.1.1" "dom.com"
> ip4=192.168.1.1
> ip6=2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d
> domain=dom.com

Всплыла проблема.
Тестилось на баше.
После цикла while обнулились перепенные $4, $3, $2, а $1 - получило значение последнего переменной

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

4. "Парсинг смешанного порядка аргументов функций"  +/
Сообщение от михалыч (ok), 04-Фев-19, 06:14 
> Всплыла проблема.
> Тестилось на баше.

это без разницы, не зависит от sh или bash

> После цикла while обнулились перепенные $4, $3, $2, а $1 - получило
> значение последнего переменной

всё правильно, классика жанра


#!/usr/local/bin/bash

while [ $# -ne 0 ] ; do

    echo "The value of \$1 is now $1"

    shift

done

./shift.sh a b c d

The value of $1 is now a
The value of $1 is now b
The value of $1 is now c
The value of $1 is now d

каждый запуск shift сдвигает переменные на одну позицию влево,
значение, сохранённое в $1 отбрасывается и больше не доступно,
$2 смещается в $1, $3 смещается в $2, $4 - в $3 и т.д.

применяя цикл while и оператор shift нельзя будет использовать $2 $3 $4
их больше нет, используй новые полученные переменные ($v4 $v6 и т.д.)

проблема может всплыть с проверкой домена (1-го аргумента) и
какого-то там template (4-го аргумента), надо чётко разграничить что есть что,
иначе есть риск перепутать

решением может быть изменение входящего 1-го аргумента с названием домена,
по принципу 2-го и 3-го аргументов с IP-адресам, например my_in_domain=dom.com

или же regexp домена, но тут вылазят всякие там punycode, тире (дефисы), знаки подчёркивания и,
в итоге, можно получить вместо названия домена 4-ый аргумент и наоборот


#!/bin/sh

while [ $# -ne 0 ] ; do

    if [ $(echo $1 | awk -F= '{print $1}') = ipv4 ] ; then
        v4=$(echo $1 | awk -F= '{print $2}')
    elif [ $(echo $1 | awk -F= '{print $1}') = ipv6 ] ; then
        v6=$(echo $1 | awk -F= '{print $2}')
    elif [ $(echo $1 | awk -F= '{print $1}') = my_in_domain ] ; then
        site=$(echo $1 | awk -F= '{print $2}')
    else
        tmpl=$1
    fi

    shift

done

echo template=$tmpl
echo ip4=$v4
echo ip6=$v6
echo domain=$site

./test.sh "ipv6=2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d" "ipv4=192.168.1.1" "my_in_domain=dom.com" "sphericus_konicus_in_vacuum"

template=sphericus_konicus_in_vacuum
ip4=192.168.1.1
ip6=2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d
domain=dom.com

ну или вот так


#!/bin/sh

while [ $# -ne 0 ] ; do

    echo $1 | grep -E '[a-zA-Z0-9]+([\-\.]{1}[a-zA-Z0-9]+)*\.[a-zA-Z]{2,}' >/dev/null 2>&1

    if [ $? -eq 0 ] ; then
        site=$1
    elif [ $(echo $1 | awk -F= '{print $1}') = ipv4 ] ; then
        v4=$(echo $1 | awk -F= '{print $2}')
    elif [ $(echo $1 | awk -F= '{print $1}') = ipv6 ] ; then
        v6=$(echo $1 | awk -F= '{print $2}')
    else
        tmpl=$1
    fi

    shift

done

echo template=$tmpl
echo ip4=$v4
echo ip6=$v6
echo domain=$site

./test.sh "ipv6=2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d" "ipv4=192.168.1.1" "test.org" "sphericus_konicus_in_vacuum"

template=sphericus_konicus_in_vacuum
ip4=192.168.1.1
ip6=2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d
domain=test.org

[upd]
не знаю, может такой вариант лучше
grep -E '[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]{2,}'


такие дела

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "Парсинг смешанного порядка аргументов функций"  +/
Сообщение от universite (ok), 04-Фев-19, 11:44 
>> Всплыла проблема.
>> Тестилось на баше.
> это без разницы, не зависит от sh или bash

Спс. Прибил гвоздями первую позицию за доменов, а остальное парсится через while.

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "Парсинг смешанного порядка аргументов функций"  +/
Сообщение от vg (??), 04-Фев-19, 12:49 
if ... elif ... громоздко

#!/bin/bash

usage="$(basename $0) [-v] -m <text>"

my_variable=""
verbose="false"
while [ $# -gt 0 ]; do
    case "$1" in
        -h|-\?)
            echo "$usage"
            exit 0
        ;;
        -m)
            if [ -z "${2:-}" ]; then
               echo "Error: $1 expects a parameter" 1>&2
               exit 1
            fi
            my_variable="$2"
            shift
        ;;
        -v)
            verbose="true"
        ;;
        *)
            echo "Error: unexpected argument: $1" 1>&2
            exit 1
        ;;
    esac
    shift
done

echo "${my_variable}"
echo "${verbose}"

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

7. "Парсинг смешанного порядка аргументов функций"  +/
Сообщение от Another (?), 24-Фев-19, 12:20 
Getops
>[оверквотинг удален]
>            
> echo "Error: unexpected argument: $1" 1>&2
>            
> exit 1
>         ;;
>     esac
>     shift
> done
> echo "${my_variable}"
> echo "${verbose}"

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

8. "Парсинг смешанного порядка аргументов функций"  +/
Сообщение от universite (ok), 10-Мрт-19, 08:37 
> Getops

Это башизм.
Только для Линукс систем и только в которых установлен баш.

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

9. "Парсинг смешанного порядка аргументов функций"  +/
Сообщение от Аноним (9), 31-Мрт-19, 22:43 
>> Getops
> Это башизм.
> Только для Линукс систем и только в которых установлен баш.

Судя по громоздкости не-getopt решения чисто "на шелле" - шелл язык использован не по назначению.

Типа: не тем средством решена задача. Или - неверно поставлена задача.

Разбор аргументов настолько рядовая и частая вещь, что полученный выше большой объём кода - признак "штопора мысли".

:) Keep it simple.

Ответить | Правка | ^ к родителю #8 | Наверх | Cообщить модератору

10. "Парсинг смешанного порядка аргументов функций"  +/
Сообщение от Аноним (10), 03-Апр-19, 12:38 
> Судя по громоздкости не-getopt решения чисто "на шелле" - шелл язык использован
> не по назначению.

Бывает так, что под рукой есть только чисто "Bourne shell" и нет даже "Bourne again shell",
не говоря уже о python, perl.
Иногда такое случается.

> Типа: не тем средством решена задача. Или - неверно поставлена задача.

Всё тем и всё верно поставлено.

> Разбор аргументов настолько рядовая и частая вещь, что полученный выше большой объём
> кода - признак "штопора мысли".

Нет. Врёте вы всё. Это всё ваши лживые инсинуации.

> :) Keep it simple.

Куда ещё проще?!

Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору


Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Спонсоры:
Слёрм
Inferno Solutions
Hosting by Ihor
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2019 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру