#!/bin/bash mask2cidr() { local mask=$1 # In RFC 4632 netmasks there's no "255." after a non-255 byte in the mask local left_stripped_mask=${mask##*255.} local len_mask=${#mask} local len_left_stripped_mask=${#left_stripped_mask} local conversion_table=0^^^128^192^224^240^248^252^254^ local number_of_bits_stripped=$(((len_mask - len_left_stripped_mask) * 2)) local signifacant_octet=${left_stripped_mask%%.*} local right_stripped_conversion_table=${conversion_table%%$signifacant_octet*} local len_right_stripped_conversion_table=${#right_stripped_conversion_table} local number_of_bits_from_conversion_table=$((len_right_stripped_conversion_table / 4)) echo $((number_of_bits_stripped + number_of_bits_from_conversion_table)) } mask2cidr "$@"