getopts
Utvecklare | Olika öppen källkod och kommersiella utvecklare |
---|---|
Initial release | 1986 |
Operativ system | Unix , Unix-liknande , IBM i |
Typ | Kommando |
getopts
är ett inbyggt Unix-skalkommando för att analysera kommandoradsargument . Den är utformad för att bearbeta kommandoradsargument som följer POSIX Utility Syntax Guidelines, baserat på C-gränssnittet för getopt .
Föregångaren till getopts
var det externa programmet getopt
av Unix System Laboratories .
Historia
Den ursprungliga getopten
hade flera problem: den kunde inte hantera blanksteg eller skalmetatecken i argument, och det fanns ingen möjlighet att inaktivera utmatningen av felmeddelanden.
getopts
introducerades först 1986 i Bourne-skalet som levererades med Unix SVR3. Den använder skalets egna variabler för att spåra positionen för aktuella positioner och argumentpositioner, OPTIND och OPTARG , och returnerar alternativnamnet i en skalvariabel. Tidigare versioner av Bourne-skalet hade inte getopts .
1995 inkluderades getopts i
Single UNIX-specifikationen version 1/ X/Open Portability Guidelines Issue 4. Som ett resultat är getopts
nu tillgängliga i skal inklusive Bourne-skal , KornShell , Almquist-skal , Bash och Zsh .
Kommandot getopts har också porterats till operativsystemet IBM i .
Den moderna användningen av getopt
återupplivades delvis, främst på grund av en förbättrad implementering i util-linux . Denna version, baserad på BSD getopt
, fixade inte bara de två klagomålen kring den gamla getopt
, utan introducerade också möjligheten att analysera långa alternativ i GNU-stil och valfria argument för alternativ, funktioner som getopts
saknar. De olika BSD-distributionerna höll sig dock till den gamla implementeringen.
Användande
Användningsöversikten för getopt och getopts liknar dess C-syskon :
getopt optstring [parametrar] getopts optstring varname [parametrar]
- Optstring - delen har samma format som C-syskonet.
-
Parametrar - delen accepterar helt enkelt vad man vill, getopt för att analysera. Ett vanligt värde är alla parametrar, "$@" i POSIX-skalet.
- Detta värde finns i getopts men används sällan, eftersom det bara kan komma åt skalets parametrar. Det är dock användbart med att återställa parsern.
- Varname - delen av getopts namnger en skalvariabel att lagra alternativet som tolkas i.
Hur man använder kommandona varierar dock mycket:
- getopt returnerar helt enkelt en platt sträng som innehåller blankstegsseparerade tokens som representerar det "normaliserade" argumentet. Man använder sedan en while-loop för att analysera den naturligt.
- getopts är tänkt att upprepade gånger kallas som C getopt. När den når slutet av argument returnerar den 1 (shell false).
Förbättringar
I olika getopter
Under våren 2004 (Solaris 10 betautveckling) förbättrades libc-implementeringen för getopt() för att stödja långa alternativ. Som ett resultat var denna nya funktion också tillgänglig i de inbyggda kommando- getopts
i Bourne Shell. Detta utlöses av suffix i parentes i opt-strängen som anger långa alias.
KornShell och Zsh har båda en förlängning för långa argument. Den förra definieras som i Solaris, medan den senare implementeras via ett separat zparseopts
-kommando.
KornShell implementerar dessutom optstring- tillägg för alternativ som börjar med +
istället för -
.
I Linux getopt
Ett alternativ till getopts
är den Linux-förbättrade versionen av getopt
, det externa kommandoradsprogrammet.
Den Linux-förbättrade versionen av getopt
har den extra säkerheten som getopts
plus mer avancerade funktioner. Den stöder långa alternativnamn (t.ex. --help
) och alternativen behöver inte visas före alla operander (t.ex. kommandot operand1 operand2 -a operand3 -b
är tillåtet av den Linux-förstärkta versionen av getopt
men fungerar inte med getopts
). Det stöder också escapende metatecken för skal (som tcsh och POSIX sh) och valfria argument.
Jämförelse
Program
Funktion
|
POSIX väljer | Solaris getopts | Unix/BSD getopt | Linux getopt |
---|---|---|---|---|
Delar alternativ för enkel analys | Ja | Ja | Ja | Ja |
Tillåter att undertrycka felmeddelanden | Ja | Ja | Nej | Ja |
Säkert med blanksteg och metatecken | Ja | Ja | Nej | Ja |
Tillåter att operander blandas med alternativ | Nej | Ja | Nej | Ja |
Stöder långa alternativ | Tävlan | Ja | Nej | Ja |
Valfria argument | Felhantering | Felhantering | Nej | Ja |
Exempel
Anta att vi bygger en Wikipedia-nedladdare i bash som tar tre alternativ och noll extra argument:
wpdown -a artikelnamn -l [språk] -v
När det är möjligt tillåter vi följande långa argument:
-a --artikel -l --språk, --lang -v --verbose
För tydlighetens skull ingår ingen hjälptext, och vi antar att det finns ett program som laddar ner vilken webbsida som helst. Dessutom är alla program av formen:
0
#!/bin/bash VERBOSE = ARTIKEL = '' LANG = sv # [EXEMPEL HÄR] if (( VERBOSE > 2 )) ; sedan printf '%s\n' 'Icke-alternativargument:' printf '%q ' " ${ resterande [@]] } " fi if (( VERBOSE > 1 )) ; printf sedan 'Hämtar %s:%s\n' " $LANG " " $ARTIKEL " fi om [[ ! $ARTIKEL ]] ; sedan printf '%s\n' "Inga artiklar!" > & 2 avsluta 1 fi save_webpage "https:// ${ LANG } .wikipedia.org/wiki/ ${ ARTIKEL } "
Använder gammal getopt
Den gamla getopten stöder inte valfria argument:
# analysera allt; om det misslyckas löser vi args = ` getopt 'a:l:v' $* ` || exit # nu har vi de sanerade argsna... ersätt originalet med det set -- $args while true ; gör fallet $1 i ( -v ) (( VERBOSE++ )) ; skift ;; ( -a ) ARTIKEL = $2 ; skift 2 ;; ( -l ) LANG = $2 ; skift 2 ;; ( - ) skift ; bryta ;; ( * ) utgång 1 ;; # error esac done resting =( " $@ " )
Det här skriptet kommer också att bryta med en artikeltitel med ett mellanslag eller en skalmetatecken (som ? eller *) i den.
Använder getopts
Getopts ger skriptet utseendet och känslan av C-gränssnittet, även om valfria argument fortfarande saknas i POSIX:
#!/bin/sh medan getopts ':a:l:v' opt ; gör fallet $opt in ( v ) (( VERBOSE++ )) ;; ( a ) ARTIKEL = $OPTARG ;; ( l ) LANG = $OPTARG ;; ( : ) # "valfria argument" (saknade alternativ-argumenthantering) fall $OPTARG i ( a ) exit 1 ;; # error, enligt vår syntax ( l ) : ;; # acceptabelt men gör ingenting esac ;; esac gjort skift " $OPTIND " # återstående är "$@"
Eftersom vi inte längre använder skalalternativ direkt behöver vi inte längre flytta dem. Det krävs dock en skivningsoperation för att få de återstående argumenten nu.
Det är möjligt, men tråkigt att efterlikna långa argumentstöd genom att behandla --fast
som ett argument snabbt
till ett alternativ -
.
Använder Linux getopt
Linux getopt undkommer dess utdata och ett "eval"-kommando behövs för att skalet ska tolka det. Resten är oförändrat:
# Vi använder "$@" istället för $* för att bevara argumentgränsinformation ARGS = $( getopt -o 'a:l::v' --long 'article:,language::,lang::,verbose' - - " $@ " ) || exit eval "set -- $ARGS " medan sant ; gör fallet $1 i ( -v | --verbose ) (( VERBOSE++ ) ) ; skift ;; ( -a | --artikel ) ARTIKEL = $2 ; skift 2 ;; ( -l | --lang | --language ) # handtag valfritt: getopt normaliserar det till en tom sträng om [ -n " $2 " ] ; sedan LANG = $2 fi skift 2 ;; ( - ) skift ; bryta ;; ( * ) utgång 1 ;; # error esac done resting =( " $@ " )
Se även
externa länkar
- The Single UNIX Specification , Version 4 från The Open Group : process kommandoradsargument – Shell and Utilities Reference,