Имеется Дебиановский баш и функция вида: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;
fifi
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
...}
Если строгий порядок, то проще.
А со смешанным порядком - хз как определять...
> Если строгий порядок, то проще.
> А со смешанным порядком - хз как определять...ну так ведь уже и определил
в правильно заданном вопросе - содержится уже половина ответа
#!/bin/shwhile [ $# -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
fishift
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
что там в четвёртом аргументе зашито, что за шаблон, я не знаю
пусть это будет "домашкой"
>[оверквотинг удален]
> echo ip4=$v4
> echo ip6=$v6
> echo domain=$site
>
спс.
Домашка будет разобраться с оператором shift.
>[оверквотинг удален]
> 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 - получило значение последнего переменной
> Всплыла проблема.
> Тестилось на баше.это без разницы, не зависит от sh или bash
> После цикла while обнулились перепенные $4, $3, $2, а $1 - получило
> значение последнего переменнойвсё правильно, классика жанра
#!/usr/local/bin/bashwhile [ $# -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/shwhile [ $# -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
fishift
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/shwhile [ $# -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
fishift
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,}'
такие дела
>> Всплыла проблема.
>> Тестилось на баше.
> это без разницы, не зависит от sh или bashСпс. Прибил гвоздями первую позицию за доменов, а остальное парсится через while.
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
doneecho "${my_variable}"
echo "${verbose}"
Getops
>[оверквотинг удален]
>
> echo "Error: unexpected argument: $1" 1>&2
>
> exit 1
> ;;
> esac
> shift
> done
> echo "${my_variable}"
> echo "${verbose}"
> GetopsЭто башизм.
Только для Линукс систем и только в которых установлен баш.
>> Getops
> Это башизм.
> Только для Линукс систем и только в которых установлен баш.Судя по громоздкости не-getopt решения чисто "на шелле" - шелл язык использован не по назначению.
Типа: не тем средством решена задача. Или - неверно поставлена задача.
Разбор аргументов настолько рядовая и частая вещь, что полученный выше большой объём кода - признак "штопора мысли".
:) Keep it simple.
> Судя по громоздкости не-getopt решения чисто "на шелле" - шелл язык использован
> не по назначению.Бывает так, что под рукой есть только чисто "Bourne shell" и нет даже "Bourne again shell",
не говоря уже о python, perl.
Иногда такое случается.> Типа: не тем средством решена задача. Или - неверно поставлена задача.
Всё тем и всё верно поставлено.
> Разбор аргументов настолько рядовая и частая вещь, что полученный выше большой объём
> кода - признак "штопора мысли".Нет. Врёте вы всё. Это всё ваши лживые инсинуации.
> :) Keep it simple.
Куда ещё проще?!