2015-12-27 11 views
5

Chcę użyć getopts w bashu. Użytkownik powinien wybrać własne opcje. większość opcji pobiera argumenty, ale są 2 opcje, które nie zawierają argumentów. Działa dobrze, gdy opcja bez argumentu znajduje się w środku polecenia, ale gdy jest na końcu, nie działa.Jak używać opcji getopts bez argumentu na końcu w bashie

Uwaga - dwa pierwsze argumenty (serwer i hasło) są obowiązkowe i nie stanowią części getopts.

#!/bin/bash 

SERVER=${1} 
PASSWORD=${2} 
VERSION=v0 
ASKED_REVISION=0 
DB=schema_1 
PROPERTIES=1 
FULL=0 
USER= 

# Usage info 
show_help() 
{ 
echo " 
     Usage: Environment DBPassword [-V Version] [-R Revision] [-S Schema] [-P] [-F] [-U Username] 

     -V Version  Version to deploy. 
     -R Revision  Revision number (0 means the latest revision). 
     -S Schema  Schema in the DB to deploy. 
     -P    No(!) External Properties. If this flag is marked the deploy will not copy the external properties 
     -F    Full deploy 
     -U    Username. This User who run the deploy. 

     For Example: ./deploy server1 123456 -V v1.0 -R 12345 -S schema1 -P -F -U User1 

     -H    Help 
" 
} 
OPTIND=3 
while getopts ":V:R:S:P:F:U:H:" FLAG; do 
    case "$FLAG" in 
     V) # Set option "V" [Version] 
       VERSION=$OPTARG 
       ;; 
     R) # Set option "R" [Revision] 
       ASKED_REVISION=$OPTARG 
       ;; 
     S) # Set option "S" [Schema] 
       DB=$OPTARG 
       ;; 
     P) # Set option "P" [No External Properties] 
       PROPERTIES=0 
       OPTIND=$OPTIND-1 
       ;; 
     F) # Set option "F" [FULL] 
       FULL=1 
       OPTIND=$OPTIND-1 
       ;; 


U) # Set option "U" [User] 
      USER=$OPTARG 
      ;; 
    H) # help 
      show_help 
      ;; 
    \?) 
      echo "Invalid option: -$OPTARG. Use -H flag for help." 
      exit 
      ;; 
    esac 
done 

shift $((OPTIND-1)) #This tells getopts to move on to the next argument. 

echo "Env=$SERVER" 
echo "Pass=$PASSWORD" 
echo "Version=$VERSION" 
echo "Revision=$ASKED_REVISION" 
echo "Schema=$DB" 
echo "External Properties=$PROPERTIES" 
echo "FULL=$FULL" 
echo "USER=$USER" 

-F i -P nie powinny uzyskać argumentu. Kiedy uruchomić to polecenie to działa prawidłowo (-F w środku):

./deploy_test.sh server1 pass1234 -U 555 -R 55555 -F -V v1.0 

Gdy -F lub -P są w końcu polecenia, Linia ta nie działa poprawnie (wszystko działa dobrze, ale -F):

./deploy_test.sh server1 pass1234 -U 555 -R 55555 -V v1.0 -F 

Odpowiedz

6

Wyjąć dwukropka z opcji, które nie wymagają argumentów, a nie ręcznie wykonywać żadnej przesunięcie lub zmianę OPTIND siebie w while/case statment (będziesz jeszcze potrzebować ustawić OPTIND przed pętlą while, aby pominąć pierwsze 2 argumenty):

while getopts ":V:R:S:PFU:H" FLAG; do 

Mam pokazano linię while z odpowiednimi zmianami dla opcji P i F jak również dla H ponieważ również nie wymaga argumentu.

Zgodnie the documentation:

jeśli postać następuje dwukropek, opcja ma argument

Więc : powinny być tam tylko dla opcji z argumentów.

+0

ale jeśli zrobi coś takiego ./deploy_test.sh serwer1 pass1234 -F nigdy nie trafi do pętli while i chcę FULL ma być zmieniony na 1 – Nissim

+0

to działa! dzięki. – Nissim

+0

Cieszę się, że to się udało – Julian

Powiązane problemy