2016-11-07 6 views
-1

Я работаю над секцией скрипта, который принимает сетевую маску в CIDR (/## или просто ##) или в виде точечно-десятичной (###.###.###.###) нотации. Оба в конечном итоге являются десятичными обозначениями после преобразования, но я хочу предоставить гибкость для ввода CIDR. Мои регулярные выражения, кажется, не работает, хотя:Bash regex failing in case statement

Все мой тестовый код:

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 

Как я уже говорил, что регулярные выражения, кажется, не работает. Все падает в случае по умолчанию заявление на:

[[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 включая $mask, "$mask" и ${mask}. Я также пробовал не избегать / для нотации CIDR (^/[0-9][0-9]).

Что я делаю неправильно?

+1

Насколько я знаю, bash не поддерживает регулярное выражение в операторах case. – Mat

+2

Оператор 'case' поддерживает только стиль (globbing-style) _patterns_, а не _ regular expressions_. – mklement0

+0

Ну, это корма. – theillien

ответ

0

За комментарии по моему вопросу, case bash не поддерживает регулярное выражение; Только глотание.