Bash
getopts: smart positionering-parameter-parsing
Sök…
Syntax
- getopts optstring name [args]
parametrar
Parameter | Detalj |
---|---|
flaggsträng | Alternativtecken som ska kännas igen |
namn | Sedan namn där det parsade alternativet är lagrat |
Anmärkningar
alternativ
optstring
: Alternativtecken som ska kännas igenOm ett tecken följs av en kolon förväntas alternativet ha ett argument, som bör separeras från det med vitrum. Kolon (
:
) (och frågetecken?
) Kan inte användas som alternativ tecken.
Varje gång det åberopas placerar getopts
nästa alternativ i skalvariabelns namn, initialiserar namn om det inte finns, och indexet för nästa argument som ska behandlas till variabeln OPTIND
. OPTIND
initieras till 1
varje gång skalet eller ett skalskript aktiveras.
När ett alternativ kräver ett argument placerar getopts
detta argument i variabeln OPTARG
. Skalet återställer inte OPTIND
automatiskt; det måste återställas manuellt mellan flera samtal till getopts
inom samma shell-kallelse om en ny uppsättning parametrar ska användas.
När slutet på alternativen stöter ut, kommer getopts
med ett returvärde större än noll.
OPTIND
är inställt på indexet för det första argumentet utan alternativ, och namnet är inställt på ?
. getopts
analyserar vanligtvis positionsparametrarna, men om fler argument ges i args
, analyserar getopts
dessa istället.
getopts
kan rapportera fel på två sätt. Om det första tecknet i optstring
är ett kolon ( :
) är tyst felrapportering används. Vid normal drift skrivs diagnostiska meddelanden ut när ogiltiga alternativ eller saknade alternativargument uppstår.
Om variabeln OPTERR
är inställd på 0
visas inga felmeddelanden, även om det första tecknet i optstring
inte är en kolon.
Om ett ogiltigt alternativ getopts
placerar getopts
platser ?
till name
och, om inte tyst, skriver ut ett felmeddelande och återställer OPTARG
. Om getopts
är tyst placeras det OPTARG
alternativtecknet i OPTARG
och inget diagnostiskt meddelande skrivs ut.
Om ett nödvändigt argument inte hittas, och getopts
inte är tyst, placeras ett frågetecken ( ?
) I name
, OPTARG
avbryts och ett diagnostiskt meddelande skrivs ut. Om getopts
är tyst, då ett kolon ( :
) placeras i namn och OPTARG
är inställd på alternativet karaktär.
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
Produktion
$ ./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]