> Всплыла проблема.
> Тестилось на баше.это без разницы, не зависит от 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
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/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
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,}'
такие дела