このbash変数は有効なIP v4または6アドレスですか?

このbash変数は有効なIP v4または6アドレスですか?

bash(最新のDebian test / bookworm aptのv5.2)という変数がありますTARGET。コンテンツが有効なIPv4またはIPv6アドレスであり、同様のアドレスではないことを確認するにはどうすればよいですかERROR

ベストアンサー1

bash正規表現を使用して単純な検証を実行して、変数が予想される形式と一致することを確認できます。

is_ipv4_address() {
  [[ $1 =~ [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ]]
}

上記の関数を使用して、次のスクリプトを実行できます。

for data in 1.2 1.2.3 1.2.3.4; do
  echo -n "$data: "
  is_ipv4_address "$data" && echo yes || echo no
done

出力を取得します。

1.2: no
1.2.3: no
1.2.3.4: yes

これは「緩い」検証です。つまり、999.999.999.999パターンと一致しますが、有効なアドレスではありません。より完全なソリューションが必要な場合は、次のものを使用できます。Linuxジャーナル記事このトピックについて。


IPv6はもう少し複雑です。完全に拡張された形式を一致させるのは簡単ですが、ゼロを縮小できるため、それ自体はうまくいきません。

次のように起動できます。

is_ipv6_address() {
  [[ $1 =~ ^([0-9a-fA-F]{0,4}:){0,7}[0-9a-fA-F]{1,4}$ ]]
}

以前の解決策と同様に、これは緩い一致です。〜する一致は実際にはipv6アドレスの内容ではありませんが、必要に応じて大丈夫かもしれません。以下はいくつかのテストケースです。

testcases=(
1.2.3.4
2001:foo
"i am not an ip address"
2001:0000:3238:DFE1:0063:0000:0000:FEFB
2001:0000:3238:DFE1:63:0000:0000:FEFB
2001:0000:3238:DFE1:63::FEFB
2001:0:3238:DFE1:63::FEFB
2c:f0:5d:c9:12:a9
)

for testcase in "${testcases[@]}"; do
  echo -n "$testcase: "
  is_ipv6_address "$testcase" && echo yes || echo no
done

上記の出力は次のとおりです。

1.2.3.4: no
2001:foo: no
i am not an ip address: no
2001:0000:3238:DFE1:0063:0000:0000:FEFB: yes
2001:0000:3238:DFE1:63:0000:0000:FEFB: yes
2001:0000:3238:DFE1:63::FEFB: yes
2001:0:3238:DFE1:63::FEFB: yes
2c:f0:5d:c9:12:a9: yes

したがって、有効なipv6アドレス形式と一致し、明らかに誤った形式は拒否されますが、MACアドレスと一致することがわかります。改善の余地がありますが、これが出発点になることを願っています。

おすすめ記事