The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Парсинг смешанного порядка аргументов функций, !*! universite, 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
    ...

}

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

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

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


    #!/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


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

    • Парсинг смешанного порядка аргументов функций, !*! universite, 22:42 , 03-Фев-19 (2)
      >[оверквотинг удален]
      > 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.

    • Парсинг смешанного порядка аргументов функций, !*! universite, 05:05 , 04-Фев-19 (3) –1
      >[оверквотинг удален]
      >     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 - получило значение последнего переменной

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

        это без разницы, не зависит от 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,}'


        такие дела

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

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

          • Парсинг смешанного порядка аргументов функций, !*! vg, 12:49 , 04-Фев-19 (6)
            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}"




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

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