Bash
getopts: analyse intelligente des paramètres positionnels
Recherche…
Syntaxe
- getopts optstring name [args]
Paramètres
Paramètre | Détail |
---|---|
optstring | Les caractères d'option à reconnaître |
prénom | Puis le nom où l'option analysée est stockée |
Remarques
Les options
optstring
: les caractères d'option à reconnaîtreSi un caractère est suivi de deux points, l’option doit avoir un argument, qui doit être séparé par un espace blanc. Les deux points (
:
) (point d'interrogation?
) Ne peuvent pas être utilisés comme caractères d'option.
À chaque appel, getopts
place l'option suivante dans le nom de la variable shell, en initialisant le nom s'il n'existe pas, et l'index du prochain argument à traiter dans la variable OPTIND
. OPTIND
est initialisé à 1
chaque fois que le shell ou un script shell est appelé.
Lorsqu'une option nécessite un argument, getopts
place cet argument dans la variable OPTARG
. Le shell ne réinitialise pas automatiquement OPTIND
; il doit être réinitialisé manuellement entre plusieurs appels à getopts
dans la même invocation de shell si un nouvel ensemble de paramètres doit être utilisé.
Lorsque la fin des options est rencontrée, getopts
avec une valeur de retour supérieure à zéro.
OPTIND
est défini sur l'index du premier argument non-option et name est défini sur ?
. getopts
analyse normalement les paramètres de position, mais si plus d'arguments sont donnés dans args
, getopts
analyse à la place.
getopts
peuvent signaler des erreurs de deux manières. Si le premier caractère de optstring
est deux points ( :
), les rapports d'erreur silencieuse est utilisée. En fonctionnement normal, les messages de diagnostic sont imprimés lorsque des options non valides ou des arguments d'option manquants sont rencontrés.
Si la variable OPTERR
est définie sur 0
, aucun message d'erreur ne sera affiché, même si le premier caractère de optstring
n'est pas un deux-points.
Si une option non valide est vu, getopts
places ?
dans le name
et, si non silencieux, imprime un message d'erreur et désélectionne OPTARG
. Si getopts
est silencieux, le caractère d'option trouvé est placé dans OPTARG
et aucun message de diagnostic n'est imprimé.
Si un argument requis n'est pas trouvé et que getopts
n'est pas silencieux, un point d'interrogation ( ?
) Est placé dans le name
, OPTARG
n'est pas OPTARG
et un message de diagnostic est imprimé. Si getopts
est silencieux, deux points ( :
) est placé dans le nom et OPTARG
est réglé sur le caractère d'option.
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
Sortie
$ ./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]