The OpenNET Project / Index page

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



Индекс форумов
Составление сообщения

Исходное сообщение
"Парсинг смешанного порядка аргументов функций"
Отправлено михалыч, 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,}'


такие дела

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
  Введите код, изображенный на картинке: КОД
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



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

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