IPアドレスを確認するスクリプトを作成しています。私はこうする:
read pool
checkIp()
{
local ip=$1
local stat=1
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
OIFS=$IFS
IFS='.'
ip=($ip)
IFS=$OIFS
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
stat=$?
fi
return $stat
}
checkIp $pool
if [ $? -eq 0 ]
then
echo "valid"
else
echo "invalid"
fi
これで問題は、2番目のオクテットから始まり、入力にワイルドカード「*」が含まれることを確認することです。 (CIDR表記を使用する方が良いと思いましたが、そうではありません。)今は使用できません-le
。数字がないと失敗します。
いくつかのフォームを試しましたが、すべての変換に失敗しました。
答え1
もう一度書き直してください。 (Bash関連の正規表現を使用している場合は、BASH_REMATCH
トークン化を操作する代わりに配列だけを埋めます。)
checkIp()
{
local ip="$1"
if [[ "$ip" =~ ^([0-9]{1,3})\.([0-9]{1,3}|\*)\.([0-9]{1,3}|\*)\.([0-9]{1,3}|\*)$ ]]; then
for ((i=1;i<=4;i++)); do
[[ "${BASH_REMATCH[i]}" == '*' || "${BASH_REMATCH[i]}" -le 255 ]] || return 1
done
return 0
fi
return 1
}
修正する~によるとオーナーレビュー「*」の後の数字は禁止されています。
checkIp()
{
local ip="$1"
local asterisk=''
if [[ "$ip" =~ ^([0-9]{1,3})\.([0-9]{1,3}|\*)\.([0-9]{1,3}|\*)\.([0-9]{1,3}|\*)$ ]]; then
for ((i=1;i<=4;i++)); do
[[ "${BASH_REMATCH[i]}" == '*' || ( ! "$asterisk" && "${BASH_REMATCH[i]}" -le 255 ) ]] || return 1
[[ "${BASH_REMATCH[i]}" == '*' ]] && asterisk='1'
done
return 0
fi
return 1
}
答え2
参考として、zshを使用すると、次のように書くことができます。
[[ $ip = <0-255>.(<0-255>|"*").(<0-255>|"*").(<0-255>|"*") ]]
許可されていますが、10進数のみが考慮されるため、許可されません000001.0000255.*.0
(0377.1.1.1
8進数の範囲内であっても)。0377