2014-01-20 127 views
1

我想做两件事:1.测试IP地址的有效性。 2.在具有多个IP地址的文件中搜索IP地址。 “ips”是文件。这是我迄今为止所拥有的。每次运行脚本时,我都会得到这个结果:如果IP地址在文件中,我总是会得到“IP地址未找到并保存”,这并不重要。请帮忙。谢谢你在先进验证和搜索IP地址

$ ./test1 
IP address: 202 
Not Valid. Please re-enter the ip address 
IP address: 202.124.64.0 
IP address NOT found, and saved 
IP address: 109.234..232.0 
Not Valid. Please re-enter the ip address 
IP address: 109.234.232.0 
IP address NOT found, and saved 

脚本:

#!/bin/bash 

while true; do 

echo -e "IP address: \c" 
read ip 

function valid_ip() 
{ 
    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 
} 

if valid_ip $ip; then 
    if grep 'valid_ip $ip' ips; then 
     echo "IP address found, and saved" 
     else 
     echo "IP address NOT found, and saved" 
    fi 
    else 
    echo "Not Valid. Please re-enter the ip address" 
fi 

done 
+1

你是'while'块内创建一个功能? – fedorqui

+0

我是新来的,所以如果我做得不对,我会很感激任何建议。谢谢fedorqui –

+1

首先,将函数声明移到'while true'行之上,并且在函数中,将参数指向$ 1而不是$ ip。另外你在if语句中缺少一个正方括号。 – rojomoke

回答

1

让你的功能是这样的:

valid_ip() { 
    local stat=1 
    ip="$1" 
    if [[ $ip =~ [0-9]{1,3}\.[0-9{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then 
     OIFS=$IFS 
     IFS='.' 
     a=($ip) 
     IFS=$OIFS 
     [[ ${a[0]} -le 255 && ${a[1]} -le 255 && ${a[2]} -le 255 && ${a[3]} -le 255 ]] 
     stat=$? 
    fi 
    return $stat 
} 

然后称其为:

while true; do 
reap -p "Enter an IP address: " ip 

if valid_ip $ip; then 
    echo "IP address found, and valid" 
    break; 
else 
    echo "Not Valid. Please re-enter the ip address" 
fi 

done 
1

你的报价是关闭。 $变量不会在bash中的单引号中展开,因此它正在搜索字符串$ip,而不是变量中包含的IP地址。所以

if grep 'valid_ip $ip' ips; then 

应该

if grep $(valid_ip "$ip") ips; then