测试[]上的BASH错误

测试[]上的BASH错误,bash,shell,Bash,Shell,我希望能够在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

我希望能够在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 pf来处理我脚本的其他部分。

尽管自第一个版本以来,BASH的所有版本中都有
[…]
测试(
[…]]
取自Kornshell),在您的BASH版本中可能有一些bourneshell兼容性设置。但是,我能找到的唯一方法是在编译BASH时不使用
--enable cond命令
。尝试键入以下内容:

$ /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
选项确保
egrp
命令不会打印任何内容。相反,如果模式匹配,它将返回0,如果不匹配,它将返回1。这将与
if
命令一起使用。这是我们在straight Bourne shell时代所使用的方法,在straight Bourne shell中没有内置正则表达式,我们必须用石头凿出shell脚本,并拥有真正的VT100终端


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

尽管自第一次发布以来,所有版本的BASH都有
[…]
测试(
[…]
取自Kornshell),在您的BASH版本中可能有一些bourneshell兼容性设置。但是,我能找到的唯一方法是在编译BASH时不使用
--enable cond命令
。尝试键入以下内容:

$ /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
选项确保
egrp
命令不会打印任何内容。相反,如果模式匹配,它将返回0,如果不匹配,它将返回1。这将与
if
命令一起使用。这是我们在straight Bourne shell时代所使用的方法,在straight Bourne shell中没有内置正则表达式,我们必须用石头凿出shell脚本,并拥有真正的VT100终端


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

hmm,您提供的代码片段适合我。你确定这是错误来自第18行吗?你如何调用scipt?有趣的是,当我只是在控制台中键入它时,它就工作了,而不是在我的脚本中。。。。。第18行是我的代码中的if[..]]。。。。bash-版本:gnubash,版本4.2.24(1)-发布(x86_64-pc-linux-GNU)。。。。。调用脚本:sudo./script。sh@user2041602:第一行真的是
#/bin/bash
?@user2041602$ip的价值是多少?嗯,您提供的代码片段适合我。你确定这是错误来自第18行吗?你如何调用scipt?有趣的是,当我只是在控制台中键入它时,它就工作了,而不是在我的脚本中。。。。。第18行是我的代码中的if[..]]。。。。bash-版本:gnubash,版本4.2.24(1)-发布(x86_64-pc-linux-GNU)。。。。。调用脚本:sudo./script。sh@user2041602:第一行真的是
#/bin/bash
?@user2041602$ip的值是多少?或者,不知为什么,您没有使用预期的shell。。。不是支持“[]”的命令行shell;没有[[内置]的较弱shell将尝试查找[[可执行。@Gilbert这可能是真的,但OP在其程序的第一行中有
#!/bin/bash
,它应该指定
bash
shell。我看到bash shell链接到
/bin/sh
,如果您以
/bin/sh
的形式执行shell,它将不会执行bash扩展。我还认为OP的站点可能有一些功能g在
/etc/bashrc
中,这将消除像
[[
,但我在
set-o
shopt
中都找不到任何选项可以打开或关闭特定功能。此外,如果用户明确指定
bash
作为其选择的执行shell,你为什么要这样做?在我生命中的这个时候,我已经看到了重定向shell所做的各种奇怪的事情s由cp或ln生成。不经常,但发生时痛苦很大。或者,不知何故,您没有使用预期的shell…不是支持“[]”的命令行shell;没有[[内置]的较弱shell将尝试查找[[可执行。@Gilbert这可能是真的,但OP在其程序的第一行中有
#!/bin/bash
,它应该指定
bash
shell。我看到bash shell链接到
/bin/sh
,如果您以
/bin/sh
的形式执行shell,它将不会执行bash扩展。我还认为OP的站点可能有一些功能g在
/etc/bashrc
中,这将消除像
[[
,但我在
set-o
shopt
中都找不到任何选项可以打开或关闭特定功能。此外,如果用户明确指定
bash
作为其选择的执行shell,你为什么要这样做?在我生命中的这个时候,我已经看到了重定向shell所做的各种奇怪的事情cp或ln引起的疼痛。不经常,但发生时疼痛很大。