Bash正则表达式在case语句中失败

时间:2016-11-07 07:51:21

标签: bash

我正在处理脚本的一部分,该部分接受CIDR(/####)或点分十进制(###.###.###.###)表示法中的网络掩码。两者最终都是转换后的点分十进制表示法,但我希望能够灵活地输入CIDR。我的正则表达似乎不起作用,但是:

我的所有测试代码:

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

正如我所说,正则表达似乎不起作用。一切都下降到默认的case语句:

[user@centos7 bin]$ bash scratch.sh 
Enter the netmask in either CIDR or dotted notation: 24
Invalid netmask
[user@centos7 bin]$ bash scratch.sh 
Enter the netmask in either CIDR or dotted notation: /24
Invalid netmask
[user@centos7 bin]$ bash scratch.sh 
Enter the netmask in either CIDR or dotted notation: 255.255.255.0
Invalid netmask

我尝试过将$ mask变量读入case的不同方法,包括$mask"$mask"${mask}。我还尝试不转发/ CIDR表示法(^/[0-9][0-9])。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

根据我的提问,bash&#39; case不支持正则表达式;只有全球化。