Bash
getopts: slimme positionele-parameter parsing
Zoeken…
Syntaxis
- getopts optstring naam [args]
parameters
Parameter | Detail |
---|---|
optstring | De te herkennen optietekens |
naam | Geef vervolgens de naam op waar de geparseerde optie is opgeslagen |
Opmerkingen
opties
optstring
: de te herkennenoptstring
Als een teken wordt gevolgd door een dubbele punt, wordt van de optie verwacht dat deze een argument heeft, dat hiervan moet worden gescheiden door witruimte. De dubbele punt (
:
) (en vraagteken?
) Kan niet worden gebruikt als optie karakters.
Elke keer dat het wordt aangeroepen, plaatst getopts
de volgende optie in de naam van de shell-variabele, initialiseert de naam als deze niet bestaat, en de index van het volgende argument dat moet worden verwerkt in de variabele OPTIND
. OPTIND
wordt geïnitialiseerd op 1
telkens wanneer de shell of een shellscript wordt aangeroepen.
Wanneer een optie een argument vereist, plaatst getopts
dat argument in de variabele OPTARG
. De shell reset OPTIND
automatisch; het moet handmatig worden gereset tussen meerdere oproepen om getopts
binnen dezelfde shell-aanroep te krijgen als een nieuwe set parameters moet worden gebruikt.
Wanneer het einde van opties wordt aangetroffen, wordt getopts
afgesloten met een retourwaarde groter dan nul.
OPTIND
is ingesteld op de index van het eerste niet- OPTIND
en de naam is ingesteld op ?
. getopts
ontleedt normaal gesproken de positionele parameters, maar als er meer argumenten worden gegeven in args
, ontleedt getopts
deze in plaats daarvan.
getopts
kan fouten op twee manieren melden. Als het eerste teken van optstring
is een dubbele punt ( :
), wordt stil foutrapportage gebruikt. Bij normaal gebruik worden diagnostische berichten afgedrukt wanneer ongeldige opties of ontbrekende optieargumenten worden aangetroffen.
Als de variabele OPTERR
is ingesteld op 0
, worden er geen foutberichten weergegeven, zelfs als het eerste teken van optstring
geen dubbele punt is.
Als u een ongeldige optie ziet, getopts
plaatsen ?
in name
en, indien niet stil, drukt een foutmelding af en schakelt OPTARG
. Als getopts
stil is, wordt het gevonden OPTARG
in OPTARG
geplaatst en wordt er geen diagnostisch bericht afgedrukt.
Als een vereist argument niet wordt gevonden en getopts
niet stil is, wordt een vraagteken ( ?
) In de name
geplaatst, is OPTARG
uitgeschakeld en wordt een diagnostisch bericht afgedrukt. Als getopts
zwijgt, dan een dubbele punt ( :
) wordt geplaatst in naam en OPTARG
is ingesteld op de optie karakter.
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
uitgang
$ ./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]