Search ip address

/# Имя скрипта: ip_info.sh
/# Описание: Получает и отображает информацию об IP-адресах.
/# Usage: ip_info.sh [—help] [—public] [—private] [—location] # —help — Отображает справочную информацию.
/# —public — Отображает публичный IP-адрес.
/# —private — Отображает частный IP-адрес.
/# —location — Отображение информации о местоположении публичного IP-адреса.


display_usage() {
    cat << EOF
Usage: $0 [--help] [--public] [--private] [--location]

This script retrieves and displays information about IP addresses.

Options:
    --help      Display this help and exit.
    --public    Display the public IP address.
    --private   Display the private IP address.
    --location  Display location information for the public IP address.
EOF
}

display_public_ip() {
    public_ip=$(curl -s https://api.ipify.org)
    echo "Public IP: $public_ip"
}

display_private_ip() {
    private_ip=$(hostname -I | awk '{print $1}')
    echo "Private IP: $private_ip"
}

display_location() {
    if [[ -z $public_ip ]]; then
        public_ip=$(curl -s https://api.ipify.org)
    fi
    location_info=$(curl -s http://ip-api.com/json/"$public_ip")
    country=$(echo "$location_info" | grep -Po '"country":.*?[^\\]",' | awk -F':' '{print $2}' | sed 's/","//g' | sed 's/"//g')
    region=$(echo "$location_info" | grep -Po '"regionName":.*?[^\\]",' | awk -F':' '{print $2}' | sed 's/","//g' | sed 's/"//g')
    postal_code=$(echo "$location_info" | grep -Po '"zip":.*?[^\\]",' | awk -F':' '{print $2}' | sed 's/","//g' | sed 's/"//g')
    lat=$(echo "$location_info" | grep -Po '"lat":.*?[^\\],' | awk -F':' '{print $2}' | sed 's/,//g')
    lon=$(echo "$location_info" | grep -Po '"lon":.*?[^\\],' | awk -F':' '{print $2}' | sed 's/,//g')
    echo -e "Location Information:\nCountry: $country\nRegion: $region\nPostal Code: $postal_code\nLatitude: $lat\nLongitude: $lon"
}

main() {
    include_public_ip=true
    include_private_ip=true
    include_location=true
    while (( $# )); do
        case $1 in
            --help)
                display_usage
                exit 0
                ;;
            --public)
                include_private_ip=false
                include_location=false
                ;;
            --private)
                include_public_ip=false
                include_location=false
                ;;
            --location)
                include_public_ip=false
                include_private_ip=false
                ;;
            *)
                echo "Invalid option: $1" >&2
                display_usage >&2
                exit 1
        esac
        shift
    done
    if [[ $include_public_ip == true ]]; then
        display_public_ip
    fi
    if [[ $include_private_ip == true ]]; then
        display_private_ip
    fi
    if [[ $include_location == true ]]; then
        display_location
    fi
}
main "$@"