[英]how to verify if multiple IPs written in a line of a text file are valid using shell script?
[英]shell script + short syntax to verify valid IP
我的問題是,我想獲得一些簡短而明智的想法來驗證IP地址,然后我的示例
也許我可以在我的ksh腳本中結合使用一些perl語法
利迪亞
不要重新發明輪子。
use strict;
use warnings;
use Regexp::Common qw/net/;
# see http://search.cpan.org/dist/Regexp-Common/lib/Regexp/Common/net.pm
my $Address = '...';
# adapted from the module's synopsis
for ( $Address ) {
/$RE{net}{IPv4}/ and print "Dotted decimal IP address";
/$RE{net}{IPv4}{hex}/ and print "Dotted hexadecimal IP address";
/$RE{net}{IPv4}{oct}{-sep => ':'}/ and
print "Colon separated octal IP address";
/$RE{net}{IPv4}{bin}/ and print "Dotted binary IP address";
/$RE{net}{MAC}/ and print "MAC address";
/$RE{net}{MAC}{oct}{-sep => " "}/ and
print "Space separated octal MAC address";
}
使用您需要的那個。
如果您無法安裝該模塊,則只需瀏覽該模塊的代碼並獲得正確的正則表達式即可使用,具體取決於您要匹配的IP地址類型。
或者,如果地址與您想要的任何符號相匹配,則只需使用上述類似內容並調用相同的子對象即可,也可以使用類似的東西。
在您的shell腳本中使用它的方式如下:
return perl -e'use Regexp::Common qw/net/;$ip=shift;if ($ip =~ /$RE{net}{IPv4}/){exit 0}else{exit 1}' "$Address";
上面的代碼將替換您完整的“ case”塊。
同樣,如果您需要在perl腳本調用中內聯正則表達式,則可以通過閱讀模塊的代碼來實現。
check(){
case "$1" in
[0-9]|[0-9][0-9]|[0-1][0-9][0-9]|2[0-4][0-9]|25[0-5] ) echo "0";;
*) echo "1";;
esac
}
ip="$1"
OIFS="$IFS"
IFS="."
set -- $ip
result="$(check $1)$(check $2)$(check $3)$(check $4)"
case "$result" in
"0000" ) echo "IP $ip Ok";;
*) echo "IP $ip not ok";;
esac
IFS="$OLDIFS"
分割地址而不接觸IFS,並通過按位移位避免復雜的檢查:
declare -a part=( ${ip//\./ } )
declare -i valid=0
for p in ${part[@]}; do
if [[ $p =~ ^[[:digit:]]+$ ]] ; then
((valid += p>>8 ))
else
((valid++))
fi
done
if [ $valid -eq 0 ] ; then
echo -e "$ip OK"
else
echo -e "$ip NOT OK"
fi
這是一些更短,更簡單的方法。 它僅檢查基本結構,但在某些情況下已足夠。
VALID=$(echo $IP | egrep '^[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}$');
if [ ! -n "$VALID" ]; then
echo "This IP ($IP) isn't valid. Please check it and try again.";
exit 0;
fi;
將IP地址保存到ip_server並使用以下代碼檢查它:
if [[ "$ip_server" =~ ^([0-9]{1,3})[.]([0-9]{1,3})[.]([0-9]{1,3})[.]([0-9]{1,3})$ ]]
then
for (( i=1; i<${#BASH_REMATCH[@]}; ++i ))
do
(( ${BASH_REMATCH[$i]} &2; exit 1; }
done
else
echo "Wrong IP address" >&2
exit 1;
fi
Bash> = 3.2版(可以大大縮短):
valid () {
if [[ $1 =~ ^[[:digit:]]+$ ]] &&
(( $1 >= 0 && $1 <= 255 ))
then
echo "0"
return 0
else
echo "1"
return 1
fi
}
saveIFS=$IFS
IFS='.'
ip=($1)
IFS=$saveIFS
for octet in ${ip[@]}
do
if ! valid $octet > /dev/null
then
valid=1
fi
done
[[ $valid != 1 ]] && echo "Good address" || echo "Bad address"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.