1

我希望能够验证某些东西是 bash 脚本中的 IP 形式,并且我在网上找到了各种代码......它们都具有大致相同的结构..

#!/bin/bash


valid_ip()
{

    local  ip=$1
    echo $ip

    if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
        ret=0 # is an IP
    else
        ret=1 # isn't an IP
    fi

    return $ret

}


# SCRIPT -------------------------------------

#clear the table
ipfw table 1 flush

ips=$(dig -f ./hostnames.txt +short)


# For each of the IPs check that it is a valid IP address
# then check that it does not exist in the ips file already
# if both checks pass append the IP to the file
for ip in $ips
do
    if valid_ip $ip; then 
        if grep -R "$ip" "~/Dropbox/ProxyBox Stuff/dummynet/ips.txt"; then 
                echo "$ip already exists"
            else
                echo $ip >> ips.txt

        fi
    fi

done


# get the IP's and add them to table 1
cat ips.txt | while read line; do
ipfw table 1 add $line
done

无论如何,我收到以下错误

./script.sh: 18: ./script.sh: [[: not found

我不明白为什么我不能完成这个测试......任何帮助将不胜感激。

我用

sudo ./script.sh

我相信使用 sudo 会导致问题,但我的脚本的其他部分需要 sudo p。

4

1 回答 1

1

尽管[[ ... ]]自第一个版本以来的所有版本的 BASH 都进行了测试([[ ... ]]取自 Kornshell),但您的 BASH 版本中可能存在一些 Bourne shell 兼容性设置。然而,我唯一能想到的就是编译没有--enable-cond-command. 试着输入这个:

$ /bin/bash -c help

这将打印出一堆不同的帮助选项。旁边带有星号的那些表示您的 BASH 版本没有启用该内置命令。

最后,您可能必须找到一个替代这个内置...

尝试这个:

if echo "$ip" |  egrep -q "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$"

请注意,您根本不使用方括号或双方括号。

-q选项确保该egrep命令不会打印出任何内容。相反,如果模式匹配,它将返回 0,如果不匹配,则返回 1。这将与if命令一起使用。这是我们在直接使用 Bourne shell 的日子里使用的方式,其中没有将正则表达式内置到 shell 中,我们不得不用石头凿出 shell 脚本,并拥有真正的 VT100 终端。

顺便说一句,在您的正则表达式中,500.600.700.900仍然会显示为有效的 IP 地址。

于 2013-03-10T00:19:18.097 回答