IP 주소를 확인하는 스크립트를 작성 중입니다. 나는 이렇게 한다:
read pool
checkIp()
{
local ip=$1
local stat=1
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
OIFS=$IFS
IFS='.'
ip=($ip)
IFS=$OIFS
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
stat=$?
fi
return $stat
}
checkIp $pool
if [ $? -eq 0 ]
then
echo "valid"
else
echo "invalid"
fi
이제 문제는 두 번째 옥텟부터 시작하여 입력에 와일드카드 "*"가 포함될 수 있는지 확인하는 것입니다. (CIDR 표기법을 사용하는 것이 더 좋을 것이라고 생각했지만 그렇지 않습니다.) 이제는 사용할 수 없습니다 -le
. 숫자가 없으면 실패합니다.
몇 가지 양식을 시도했지만 모든 변환에 실패했습니다.
답변1
추가로 다시 작성해 보세요. (Bash 관련 정규식을 사용하는 경우 BASH_REMATCH
토큰화를 조작하는 대신 배열만 채우면 됩니다.)
checkIp()
{
local ip="$1"
if [[ "$ip" =~ ^([0-9]{1,3})\.([0-9]{1,3}|\*)\.([0-9]{1,3}|\*)\.([0-9]{1,3}|\*)$ ]]; then
for ((i=1;i<=4;i++)); do
[[ "${BASH_REMATCH[i]}" == '*' || "${BASH_REMATCH[i]}" -le 255 ]] || return 1
done
return 0
fi
return 1
}
고쳐 쓰다~에 따르면소유자 리뷰"*" 뒤의 숫자는 금지됩니다.
checkIp()
{
local ip="$1"
local asterisk=''
if [[ "$ip" =~ ^([0-9]{1,3})\.([0-9]{1,3}|\*)\.([0-9]{1,3}|\*)\.([0-9]{1,3}|\*)$ ]]; then
for ((i=1;i<=4;i++)); do
[[ "${BASH_REMATCH[i]}" == '*' || ( ! "$asterisk" && "${BASH_REMATCH[i]}" -le 255 ) ]] || return 1
[[ "${BASH_REMATCH[i]}" == '*' ]] && asterisk='1'
done
return 0
fi
return 1
}
답변2
참고로 zsh를 사용하면 다음과 같이 작성할 수 있습니다.
[[ $ip = <0-255>.(<0-255>|"*").(<0-255>|"*").(<0-255>|"*") ]]
허용되지만 10진수만 고려하므로 000001.0000255.*.0
허용되지 않습니다 0377.1.1.1
(8진수 범위 내에 있더라도 ).0377