#!/usr/bin/env bash set -o errexit set -o pipefail set -o nounset readonly SCRIPT_NAME="${0##*/}" check_deps() { command -v "curl" >/dev/null 2>&1 || die "curl: command not found" } usage() { cat <&2 exit 1 } invalid_option() { local -r option="$1" die "invalid option $(shell_quote "${option}")\nTry '${SCRIPT_NAME} --help' for usage." } parse_args() { family="auto" while (( $# > 0 )); do case "$1" in -h|--help) usage; exit 0 ;; --family) ( (( $# < 2 )) || [[ -z "$2" ]] ) && die "--family requires an argument (auto, 4 or 6)" family="$2" shift 2 ;; --family=*) family="${1#*=}" [[ -z "${family}" ]] && die "--family requires an argument (auto, 4 or 6)" shift ;; *) invalid_option "$1" ;; esac done validate_args } validate_args() { case "${family}" in auto|4|6) ;; *) die "invalid value for family: '${family}' (expected auto, 4 or 6)" esac } show_ip() { local -a curl_args=() [[ ${family} == "4" ]] && curl_args=( "-4" ) [[ ${family} == "6" ]] && curl_args=( "-6" ) curl "${curl_args[@]}" "zx2c4.com/ip" } main() { check_deps parse_args "$@" show_ip } main "$@"