Script bash para predicciones meteorológicas.
En este articulo creamos un script bash con el cual podremos visualizar las predicciones meteorológicas (el tiempo) en nuestra consola / terminal.
Las posibilidades de este script son infinitas si tienes un poco de imaginación, y todo gracias al gran trabajo de Igor Chubin.
Lo vemos…
Creamos el archivo.
1 | nano eltiempo.sh |
Copia y pega el siguiente código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 | #!/usr/bin/env bash locale=$(echo $LANG | cut -c1-2) unset configuredClient if [[ $(echo $locale | grep -Eo "[a-z A-Z]*" | wc -c) != 3 ]]; then locale="es"; fi getConfiguredClient() { if command -v curl &>/dev/null; then configuredClient="curl" elif command -v wget &>/dev/null; then configuredClient="wget" elif command -v http &>/dev/null; then configuredClient="httpie" elif command -v fetch &>/dev/null; then configuredClient="fetch" else echo "Error: This tool reqires either curl, wget, httpie or fetch to be installed\." >&2 return 1 fi } httpGet() { case "$configuredClient" in curl) curl -A curl -s "$@" ;; wget) wget -qO- "$@" ;; httpie) http -b GET "$@" ;; fetch) fetch -q "$@" ;; esac } getIPWeather() { country=$(httpGet ipinfo.io/country) > /dev/null if [[ $country == "US" ]]; then city=$(httpGet ipinfo.io/city) > /dev/null region=$(httpGet ipinfo.io/region) > /dev/null if [[ $(echo $region | wc -w) == 2 ]];then region=$(echo $region | grep -Eo "[A-Z]*" | tr -d "[:space:]") fi httpGet $locale.wttr.in/$city,$region$1 else location=$(httpGet ipinfo.io/loc) > /dev/null httpGet $locale.wttr.in/$location$1 fi } getLocationWeather() { args=$(echo "$@" | tr " " + ) httpGet $locale.wttr.in/${args} } checkInternet() { httpGet github.com > /dev/null 2>&1 || { echo "Error: no active internet connection" >&2; return 1; } } usage() { cat <<EOF Weather Description: Provides a 3 day forecast on your current location or a specified location. With no flags Weather will default to your current location. Usage: weather or weather [flag] or weather [country] or weather [city] [state] weather [i][M] get weather in imperial units, optional M means windspeed in m/s weather [m][M] get weather in metric units, optional M means windspeed in m/s weather [Moon] grabs the phase of the moon -u Update Bash-Snippet Tools -h Show the help -v Get the tool version Examples: weather weather Paris m weather Tokyo weather Moon weather mM EOF } getConfiguredClient || exit 1 while getopts "uvh" opt; do case "$opt" in \?) echo "Invalid option: -$OPTARG" >&2 exit 1 ;; h) usage exit 0 ;; v) echo "Version $currentVersion" exit 0 ;; u) checkInternet || exit 1 update || exit 1 exit 0 ;; :) echo "Option -$OPTARG requires an argument." >&2 exit 1 ;; esac done if [[ $# == "0" ]]; then checkInternet || exit 1 getIPWeather || exit 1 exit 0 elif [[ $1 == "help" || $1 == ":help" ]]; then usage exit 0 elif [[ $1 == "update" ]]; then checkInternet || exit 1 update || exit 1 exit 0 fi checkInternet || exit 1 if [[ $1 == "m" ]]; then getIPWeather "?m" || exit 1 elif [[ "${@: -1}" == "m" ]];then args=$( echo "${@:1:(($# - 1))}" ?m | sed s/" "//g) getLocationWeather $args || exit 1 elif [[ $1 == "M" ]]; then getIPWeather "?M" || exit 1 elif [[ "${@: -1}" == "M" ]];then args=$( echo "${@:1:(($# - 1))}" ?M | sed s/" "//g) getLocationWeather $args || exit 1 elif [[ $1 == "mM" || $1 == "Mm" ]]; then getIPWeather "?m?M" || exit 1 elif [[ "${@: -1}" == "mM" || "${@:-1}" == "Mm" ]];then args=$( echo "${@:1:(($# - 1))}" ?m?M | sed s/" "//g) getLocationWeather $args || exit 1 elif [[ $1 == "iM" || $1 == "Mi" ]]; then getIPWeather "?u?M" || exit 1 elif [[ "${@: -1}" == "iM" || "${@:-1}" == "Mi" ]];then args=$( echo "${@:1:(($# - 1))}" ?u?M | sed s/" "//g) getLocationWeather $args || exit 1 elif [[ $1 == "i" ]]; then getIPWeather "?u" || exit 1 elif [[ "${@: -1}" == "i" ]];then args=$( echo "${@:1:(($# - 1))}" ?u | sed s/" "//g) getLocationWeather $args || exit 1 else getLocationWeather "$@" || exit 1 fi |
Guarda el archivo y cierra el editor.
Lo puedes ejecutar, con:
1 | bash eltiempo.sh |
El script detectara automáticamente tu localización (por IP), y te ofrecerá en la consola de manera gráfica la predicción meteorológica.
Debo decir que dependiendo de tu situación, no siempre puede identificar la población, en ese caso ofrecerá los datos desde tu longitud y latitud.
Vemos los dos ejemplos de salida…
Con población Monzón, Huesca (España):
Con latitud y longitud (otra localización desde Ucrania, donde no identifica la población).
Espero te resulte útil.