Bash
getopts: parsing intelligente dei parametri posizionali
Ricerca…
Sintassi
- getopts nome optstring [args]
Parametri
Parametro | Dettaglio |
---|---|
optstring | I caratteri opzione da riconoscere |
nome | Quindi nominare dove è stata memorizzata l'opzione analizzata |
Osservazioni
Opzioni
optstring
: i caratteri opzione da riconoscereSe un carattere è seguito da due punti, l'opzione dovrebbe avere un argomento, che dovrebbe essere separato da esso da uno spazio bianco. I due punti (
:
) (e il punto interrogativo?
) Non possono essere utilizzati come caratteri di opzione.
Ogni volta che viene invocato, getopts
inserisce l'opzione successiva nel nome della variabile della shell, nel nome di inizializzazione se non esiste e nell'indice dell'argomento successivo da elaborare nella variabile OPTIND
. OPTIND
è inizializzato a 1
ogni volta che viene invocata la shell o uno script di shell.
Quando un'opzione richiede un argomento, getopts
colloca tale argomento nella variabile OPTARG
. La shell non resetta automaticamente OPTIND
; deve essere ripristinato manualmente tra più chiamate a getopts
all'interno della stessa chiamata di shell se deve essere utilizzato un nuovo set di parametri.
Quando si verifica la fine delle opzioni, getopts
viene getopts
con un valore di ritorno maggiore di zero.
OPTIND
è impostato sull'indice del primo argomento non opzionale e il nome è impostato su ?
. getopts
normalmente analizza i parametri posizionali, ma se vengono forniti più argomenti in args
, getopts
analizza invece.
getopts
può segnalare errori in due modi. Se il primo carattere di optstring
è due punti ( :
), è usata la segnalazione di errori in silenzio. Durante il normale funzionamento, i messaggi di diagnostica vengono stampati quando si incontrano opzioni non valide o argomenti di opzioni mancanti.
Se la variabile OPTERR
è impostata su 0
, non verranno visualizzati messaggi di errore, anche se il primo carattere di optstring
non è un due punti.
Se viene visualizzata un'opzione non valida, getopts
places ?
nel name
e, se non silenzioso, stampa un messaggio di errore e disattiva OPTARG
. Se getopts
è silenzioso, il carattere dell'opzione trovato viene inserito in OPTARG
e non viene stampato alcun messaggio di diagnostica.
Se non viene trovato un argomento obbligatorio e getopts
non è silenzioso, viene inserito un punto interrogativo ( ?
) Nel name
, OPTARG
non è impostato e viene stampato un messaggio di diagnostica. Se getopts
è in silenzio, poi i due punti ( :
) è posto in nome e OPTARG
è impostato sul carattere di opzione.
pingnmap
#!/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
Produzione
$ ./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]