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 シェルの互換性設定が含まれている可能性があります。ただし、私が見つけた唯一のことは、--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コマンドで機能します。これは、正規表現がシェルに組み込まれておらず、シェル スクリプトを石から切り出さなければならず、実際の VT100 端末を使用していた、ストレートな Bourne シェルの時代に私たちが使用していた方法です。

ちなみに、正規表現で500.600.700.900は、有効な IP アドレスとして表示されます。

于 2013-03-10T00:19:18.097 に答える