Here’s a simple function to validate IPv6 address space within a bash script
# Function to validate an IPv6 address
# Returns 0 if valid, 1 if invalid
validate_ipv6() {
local ip="$1"
# Check if empty
if [[ -z "$ip" ]]; then
return 1
fi
# Regex for IPv6: 8 groups of 0-4 hex digits, or compressed with ::
# Handles full format (e.g., 2001:0db8:0000:0000:0000:ff00:0042:8329)
# and compressed format (e.g., 2001:db8::ff00:42:8329)
local ipv6_regex='^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:(:[0-9a-fA-F]{1,4}){1,6}|::([0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}|::)$'
if [[ $ip =~ $ipv6_regex ]]; then
return 0
else
return 1
fi
}