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
| Method | Complexity | Accuracy | Best For | Speed |
|---|---|---|---|---|
| Simple regex | Low | Good | Format checking | Fastest |
| Octet validation | Moderate | Excellent | Production use | Medium |
| ping/nslookup | High | Best | Reachability | Slow |
| Python check | Moderate | Excellent | Complex rules | Medium |
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
ipcalcorbcfor 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.