Bash
getopts: análisis inteligente de parámetros posicionales
Buscar..
Sintaxis
- nombre optstring de getopts [args]
Parámetros
Parámetro | Detalle |
---|---|
optstring | Los caracteres de opción a reconocer. |
nombre | Luego nombre donde se almacena la opción analizada |
Observaciones
Opciones
optstring
: los caracteres opcionales a reconocer.Si un carácter va seguido de dos puntos, se espera que la opción tenga un argumento, que debe estar separado de él por un espacio en blanco. Los dos puntos (
:
) (y signo de interrogación?
) No pueden utilizarse como caracteres de opción.
Cada vez que se invoca, getopts
coloca la siguiente opción en el nombre de la variable de shell, inicializando el nombre si no existe, y el índice del siguiente argumento que se procesará en la variable OPTIND
. OPTIND
se inicializa en 1
cada vez que se invoca el shell o un script de shell.
Cuando una opción requiere un argumento, getopts
coloca ese argumento en la variable OPTARG
. El shell no restablece OPTIND
automáticamente; debe restablecerse manualmente entre varias llamadas a getopts
dentro de la misma invocación de shell si se va a usar un nuevo conjunto de parámetros.
Cuando se encuentra el final de las opciones, getopts
sale con un valor de retorno mayor que cero.
OPTIND
se establece en el índice del primer argumento no opcional y el nombre se establece en ?
. getopts
normalmente analiza los parámetros posicionales, pero si se dan más argumentos en args
, getopts
analiza en su lugar.
getopts
puede reportar errores de dos maneras. Si el primer carácter del optstring
es de dos puntos ( :
), se utiliza el informe de errores en silencio. En el funcionamiento normal, los mensajes de diagnóstico se imprimen cuando se encuentran opciones inválidas o argumentos de opciones faltantes.
Si la variable OPTERR
se establece en 0
, no se mostrarán mensajes de error, incluso si el primer carácter de optstring
no es dos puntos.
Si se ve una opción no válida, getopts
lugares getopts
?
en name
y, si no está en silencio, imprime un mensaje de error y OPTARG
. Si getopts
está en silencio, el carácter de opción encontrado se coloca en OPTARG
y no se imprime ningún mensaje de diagnóstico.
Si no se encuentra un argumento requerido y getopts
no está en silencio, se coloca un signo de interrogación ( ?
) En el name
, se desactiva OPTARG
y se imprime un mensaje de diagnóstico. Si getopts
es silenciosa, luego dos puntos ( :
) se coloca en nombre y OPTARG
se establece en el carácter de opción.
mapa de ping
#!/bin/bash
# Script name : pingnmap
# Scenario : The systems admin in company X is tired of the monotonous job
# of pinging and nmapping, so he decided to simplify the job using a script.
# The tasks he wish to achieve is
# 1. Ping - with a max count of 5 -the given IP address/domain. AND/OR
# 2. Check if a particular port is open with a given IP address/domain.
# And getopts is for her rescue.
# A brief overview of the options
# n : meant for nmap
# t : meant for ping
# i : The option to enter the IP address
# p : The option to enter the port
# v : The option to get the script version
while getopts ':nti:p:v' opt
#putting : in the beginnnig suppresses the errors for invalid options
do
case "$opt" in
'i')ip="${OPTARG}"
;;
'p')port="${OPTARG}"
;;
'n')nmap_yes=1;
;;
't')ping_yes=1;
;;
'v')echo "pingnmap version 1.0.0"
;;
*) echo "Invalid option $opt"
echo "Usage : "
echo "pingmap -[n|t[i|p]|v]"
;;
esac
done
if [ ! -z "$nmap_yes" ] && [ "$nmap_yes" -eq "1" ]
then
if [ ! -z "$ip" ] && [ ! -z "$port" ]
then
nmap -p "$port" "$ip"
fi
fi
if [ ! -z "$ping_yes" ] && [ "$ping_yes" -eq "1" ]
then
if [ ! -z "$ip" ]
then
ping -c 5 "$ip"
fi
fi
shift $(( OPTIND - 1 )) # Processing additional arguments
if [ ! -z "$@" ]
then
echo "Bogus arguments at the end : $@"
fi
Salida
$ ./pingnmap -nt -i google.com -p 80
Starting Nmap 6.40 ( http://nmap.org ) at 2016-07-23 14:31 IST
Nmap scan report for google.com (216.58.197.78)
Host is up (0.034s latency).
rDNS record for 216.58.197.78: maa03s21-in-f14.1e100.net
PORT STATE SERVICE
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 0.22 seconds
PING google.com (216.58.197.78) 56(84) bytes of data.
64 bytes from maa03s21-in-f14.1e100.net (216.58.197.78): icmp_seq=1 ttl=57 time=29.3 ms
64 bytes from maa03s21-in-f14.1e100.net (216.58.197.78): icmp_seq=2 ttl=57 time=30.9 ms
64 bytes from maa03s21-in-f14.1e100.net (216.58.197.78): icmp_seq=3 ttl=57 time=34.7 ms
64 bytes from maa03s21-in-f14.1e100.net (216.58.197.78): icmp_seq=4 ttl=57 time=39.6 ms
64 bytes from maa03s21-in-f14.1e100.net (216.58.197.78): icmp_seq=5 ttl=57 time=32.7 ms
--- google.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4007ms
rtt min/avg/max/mdev = 29.342/33.481/39.631/3.576 ms
$ ./pingnmap -v
pingnmap version 1.0.0
$ ./pingnmap -h
Invalid option ?
Usage :
pingmap -[n|t[i|p]|v]
$ ./pingnmap -v
pingnmap version 1.0.0
$ ./pingnmap -h
Invalid option ?
Usage :
pingmap -[n|t[i|p]|v]