我希望能够在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 pfor我脚本的其他部分。
答案 0 :(得分:1)
虽然自第一个版本([[ ... ]]
取自Kornshell)以来,[[ ... ]]
测试都在BASH的所有版本中,但您的版本中可能存在一些Bourne shell兼容性设置。 BASH。但是,我唯一能想到的就是在没有--enable-cond-command
的情况下编译BASH。尝试输入:
$ /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地址。