getopts

getopts
Utvecklare Olika öppen källkod och kommersiella utvecklare
Initial release 1986 ; 37 år sedan ( 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