bash (최신 Debian test/bookworm apt의 v5.2)라는 변수가 있습니다 TARGET
. 콘텐츠가 유효한 IPv4 또는 IPv6 주소이고 유사한 주소가 아닌지 어떻게 확인합니까 ERROR
?
답변1
bash 정규식을 사용하여 간단한 유효성 검사를 수행하여 변수가 예상 형식과 일치하는지 확인할 수 있습니다.
is_ipv4_address() {
[[ $1 =~ [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ]]
}
위의 함수를 사용하여 다음 스크립트를 실행할 수 있습니다.
for data in 1.2 1.2.3 1.2.3.4; do
echo -n "$data: "
is_ipv4_address "$data" && echo yes || echo no
done
출력을 얻습니다.
1.2: no
1.2.3: no
1.2.3.4: yes
이는 "느슨한" 검증입니다. 즉, 999.999.999.999
패턴과 일치하지만 유효한 주소가 아닙니다. 보다 완벽한 솔루션이 필요한 경우 다음을 사용할 수 있습니다.Linux 저널 기사이 주제에 대해.
IPv6은 조금 더 복잡합니다. 완전히 확장된 형식을 일치시키는 것은 간단하지만 0을 축소할 수 있으므로 그 자체로는 좋지 않습니다.
다음과 같이 시작할 수 있습니다.
is_ipv6_address() {
[[ $1 =~ ^([0-9a-fA-F]{0,4}:){0,7}[0-9a-fA-F]{1,4}$ ]]
}
이전 솔루션과 마찬가지로 이는 느슨한 일치입니다.~ 할 것이다일치는 실제로 ipv6 주소의 내용이 아니지만 필요에 따라 괜찮을 수도 있습니다. 다음은 몇 가지 테스트 사례입니다.
testcases=(
1.2.3.4
2001:foo
"i am not an ip address"
2001:0000:3238:DFE1:0063:0000:0000:FEFB
2001:0000:3238:DFE1:63:0000:0000:FEFB
2001:0000:3238:DFE1:63::FEFB
2001:0:3238:DFE1:63::FEFB
2c:f0:5d:c9:12:a9
)
for testcase in "${testcases[@]}"; do
echo -n "$testcase: "
is_ipv6_address "$testcase" && echo yes || echo no
done
위의 출력은 다음과 같습니다.
1.2.3.4: no
2001:foo: no
i am not an ip address: no
2001:0000:3238:DFE1:0063:0000:0000:FEFB: yes
2001:0000:3238:DFE1:63:0000:0000:FEFB: yes
2001:0000:3238:DFE1:63::FEFB: yes
2001:0:3238:DFE1:63::FEFB: yes
2c:f0:5d:c9:12:a9: yes
따라서 유효한 ipv6 주소 형식과 일치하고 명백히 잘못된 형식은 거부하지만 MAC 주소와 일치한다는 것을 알 수 있습니다. 개선의 여지가 있지만 이것이 출발점이 되기를 바랍니다.
답변2
ipcalc-ng
IP 주소의 유효성을 확인하는 실행 파일이 포함된 Debian 패키지가 있습니다 .
$ ipcalc-ng -c ::xx; echo $?
ipcalc-ng: bad IPv6 address: ::xx
1
$ ipcalc-ng -c ::1; echo $?
0