我对bash脚本非常新,所以基本上我无法理解它所以请任何人建议我可以更快地学习的方法。
我正在尝试编写一个bash脚本来读取ip地址并验证它。 那么请你告诉我在我用过的剧本中我犯了什么错误。
function valid_ip()
{
local IPA1=$1
local stat=1
if [[ $IPA1 =~ ^[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
}
此代码也是我从互联网本身获取的,只是为了理解这个概念,但我仍然无法得到它。
答案 0 :(得分:0)
请阅读评论:
function valid_ip()
{
local IPA1=$1
local stat=1
if [[ $IPA1 =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]];
then
OIFS=$IFS
IFS='.' #read man, you will understand, this is internal field separator; which is set as '.'
ip=($ip) # IP value is saved as array
IFS=$OIFS #setting IFS back to its original value;
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
&& ${ip[2]} -le 255 && ${ip[3]} -le 255 ]] # It's testing if any part of IP is more than 255
stat=$? #If any part of IP as tested above is more than 255 stat will have a non zero value
fi
return $stat # as expected returning
在将IFS设置为任何其他值之前,您可以按printf '%q' $IFS
检查IFS的默认值。
答案 1 :(得分:0)
function valid_ip()
{
local IPA1=$1
local stat=1
if [[ $IPA1 =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]];
then
OIFS=$IFS # Save the actual IFS in a var named OIFS
IFS='.' # IFS (Internal Field Separator) set to .
ip=($ip) # ¿Converts $ip into an array saving ip fields on it?
IFS=$OIFS # Restore the old IFS
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]] # If $ip[0], $ip[1], $ip[2] and $ip[3] are minor or equal than 255 then
stat=$? # $stat is equal to TRUE if is a valid IP or FALSE if it isn't
fi # End if
return $stat # Returns $stat
}
答案 2 :(得分:0)
我也有问题找到一个好的答案,但我终于提出了一条线,可以正确验证它是否是真正的IP(格式方式)。将IP更改为无效的IP,而不是输出:
echo '255.154.12.231' | grep -E '(([0-9]{1,3})\.){3}([0-9]{1,3}){1}' | grep -vE '25[6-9]|2[6-9][0-9]|[3-9][0-9][0-9]' | grep -Eo '(([0-9]{1,2}|1[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]{1,2}|1[0-9]{1,2}|2[0-4][0-9]|25[0-5]){1}'
第1部分检查从0到9的1-3位数后跟一个点。它会做3次{3}然后重复,而没有。
第二部分在不同的阶段中删除任何包含256到999的行。你必须明确解释这些数字;所以256-259,260-299,300-999。 有一种方法可以使用+某处更好地进行此检查,比如任何大于X的数字。
第三部分,是我开始的地方,它正在掠过确切的术语,这意味着它正在使用悬挂在它两侧的不良字符。只有在写这篇文章的时候,我才意识到我再次找到了我的答案,摆脱了不可能的事情,而不是寻找可能的事情,所以不需要最后一部分。试试这个:
echo '255.154.12.231' | grep -E '(([0-9]{1,3})\.){3}([0-9]{1,3}){1}' | grep -vE '25[6-9]|2[6-9][0-9]|[3-9][0-9][0-9]'