-1
私はCIDR(/##
またはちょうど##
)またはドット付き小数(###.###.###.###
)の表記でネットワークマスクを受け入れるスクリプトのセクションを作成しています。どちらも変換後にドット区切りの10進表記になりますが、CIDRに柔軟に対応したいと考えています。私の正規表現は、しかし、動作するようには思えません。私のテストコードのBash regex case in case文
すべてを:私が言ったように
function cidr2mask()
{
# Number of args to shift, 255..255, first non-255 byte, zeroes
set -- $((5 - ($1/8))) 255 255 255 255 $(((255 << (8 - ($1 % 8))) & 255)) 0 0 0
[ $1 -gt 1 ] && shift $1 || shift
echo ${1-0}.${2-0}.${3-0}.${4-0}
}
function validate_netmask() {
echo $1 |grep -E -q '^(254|252|248|240|224|192|128)\.0\.0\.0|255\.(254|252|248|240|224|192|128|0)\.0\.0|255\.255\.(254|252|248|240|224|192|128|0)\.0|255\.255\.255\.(254|252|248|240|224|192|128|0)' && echo "Valid netmask" || echo "Invalid netmask"
}
while [[ -z $mask ]]
do
read -p "Enter the netmask in either CIDR or dotted notation: " mask
echo "Netmask: $mask" #debugging
case $mask in
^\/?[0-9][0-9]$)
cidr=$(echo $mask |sed 's/^///')
netmask=$(cidr2mask $cidr)
validate_netmask $netmask
break
;;
^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$)
validate_netmask $mask
break
;;
*) echo "Invalid netmask"
continue
;;
esac
done
、正規表現を動作させるには表示されません。私は$mask
、"$mask"
、および${mask}
含むcase
に$マスク変数を読み取るさまざまな方法を試してみた
[[email protected] bin]$ bash scratch.sh
Enter the netmask in either CIDR or dotted notation: 24
Invalid netmask
[[email protected] bin]$ bash scratch.sh
Enter the netmask in either CIDR or dotted notation: /24
Invalid netmask
[[email protected] bin]$ bash scratch.sh
Enter the netmask in either CIDR or dotted notation: 255.255.255.0
Invalid netmask
:すべては、デフォルトのcase文に低下しています。私はまた、/
のCIDR表記(^/[0-9][0-9]
)をエスケープしようとしなかった。
私は間違っていますか?
私が知る限り、bashはcase文のregexをサポートしていません。 – Mat
'case'文は_regular expressions_ではなく(globbing-style)_patterns_のみをサポートしています。 – mklement0
それはうんこです。 – theillien