Skip to main content

How to Validate IP Address

• 2 min read
bash validation regex ip address ipv4 ipv6

Quick Answer: Validate IP Address in Bash

To validate an IPv4 address, use this regex pattern: ^([0-9]{1,3}\.){3}[0-9]{1,3}$. For stricter validation ensuring octets are 0-255, check each octet separately. The simple pattern catches format; additional checks ensure correctness.

Quick Comparison: IP Validation Methods

MethodComplexityAccuracyBest ForSpeed
Simple regexLowGoodFormat checkingFastest
Octet validationModerateExcellentProduction useMedium
ping/nslookupHighBestReachabilitySlow
Python checkModerateExcellentComplex rulesMedium

Bottom line: Use simple regex for format; add octet checks for accuracy.


Validating IP Addresses

IP validation is essential when working with networks, configurations, or user input. You can use regex patterns in Bash to validate IPv4 addresses.

Method 1: Simple IP Validation (Format Check)

Basic regex pattern for IPv4 format:

#!/bin/bash

ip="192.168.1.1"
pattern='^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$'

if [[ "$ip" =~ $pattern ]]; then
  echo "Valid IP format"
fi

More Accurate Pattern

Validate that octets are 0-255:

#!/bin/bash

validate_ip() {
  local ip="$1"

  if [[ "$ip" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then
    # Check each octet is <= 255
    IFS='.' read -ra octets <<< "$ip"
    for octet in "${octets[@]}"; do
      (( octet > 255 )) && return 1
    done
    return 0
  fi
  return 1
}

validate_ip "192.168.1.1" && echo "Valid" || echo "Invalid"
validate_ip "256.1.1.1" && echo "Valid" || echo "Invalid"

Practical Examples

#!/bin/bash

# Check if IP is in localhost range
ip="127.0.0.1"
if [[ "$ip" == 127.* ]]; then
  echo "Localhost"
fi

# Check private IP ranges
is_private_ip() {
  local ip="$1"
  [[ "$ip" == 10.* ]] || [[ "$ip" == 192.168.* ]] || [[ "$ip" == 172.1[6-9].* ]] || [[ "$ip" == 172.2[0-9].* ]] || [[ "$ip" == 172.3[01].* ]]
}

is_private_ip "10.0.0.1" && echo "Private IP"

Validating Multiple IPs

#!/bin/bash

validate_ips() {
  local file="$1"
  local valid=0 invalid=0

  while IFS= read -r ip || [[ -n "$ip" ]]; do
    if [[ "$ip" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
      ((valid++))
    else
      ((invalid++))
    fi
  done < "$file"

  echo "Valid: $valid, Invalid: $invalid"
}

validate_ips "ips.txt"

Real-World Example: Network Configuration

#!/bin/bash

check_connectivity() {
  local ip="$1"
  local pattern='^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$'

  if [[ ! "$ip" =~ $pattern ]]; then
    echo "ERROR: Invalid IP: $ip"
    return 1
  fi

  if ping -c 1 "$ip" >/dev/null 2>&1; then
    echo "✓ Host $ip is reachable"
    return 0
  else
    echo "✗ Host $ip is unreachable"
    return 1
  fi
}

check_connectivity "8.8.8.8"

IPv4 vs IPv6

#!/bin/bash

# IPv4
ipv4_pattern='^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$'

# IPv6 (simplified)
ipv6_pattern='^([0-9a-fA-F]{0,4}:){2,7}[0-9a-fA-F]{0,4}$'

address="192.168.1.1"
if [[ "$address" =~ $ipv4_pattern ]]; then
  echo "IPv4 address"
elif [[ "$address" =~ $ipv6_pattern ]]; then
  echo "IPv6 address"
else
  echo "Invalid IP"
fi

IP Range Checking

#!/bin/bash

ip_in_range() {
  local ip="$1"
  local range="$2"  # e.g., "192.168.1.0/24"

  # Simple check - in production use proper tools
  if [[ "$ip" == ${range%/*}* ]]; then
    return 0
  fi
  return 1
}

ip_in_range "192.168.1.50" "192.168.1.0/24" && echo "In range"

Important Notes

  • Simple regex validates format, not accuracy
  • Use octet validation to ensure numbers ≤ 255
  • IPv6 validation is more complex
  • Use ipcalc or bc for IP math
  • Always validate user input before using

Summary

Use the regex pattern ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ for basic IP validation, and add octet checking for stricter validation.