====== BASH - Regex - IP validity ====== #!/usr/bin/env bash ip=1.2.3.4 if [[ $ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then echo "success" else echo "fail" fi ---- ===== POSIX only ===== #!/bin/sh ip=1.2.3.4 if expr "$ip" : '[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$' >/dev/null; then echo "success" else echo "fail" fi ---- ===== Verify that each quad is less than 256 ===== #!/bin/sh ip=${1:-1.2.3.4} if expr "$ip" : '[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$' >/dev/null; then for i in 1 2 3 4; do if [ $(echo "$ip" | cut -d. -f$i) -gt 255 ]; then echo "fail ($ip)" exit 1 fi done echo "success ($ip)" exit 0 else echo "fail ($ip)" exit 1 fi **NOTE:** **expr** assumes that your regex is anchored to the left-hand-side of the string, so the initial ^ is unnecessary.. ---- ===== Verify that each quad is less than 256 - with fewer pipes ===== #!/bin/sh ip=${1:-1.2.3.4} if expr "$ip" : '[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$' >/dev/null; then IFS=. set $ip for quad in 1 2 3 4; do if eval [ \$$quad -gt 255 ]; then echo "fail ($ip)" exit 1 fi done echo "success ($ip)" exit 0 else echo "fail ($ip)" exit 1 fi