2015-12-27 5 views
5

verwenden Ich möchte getopts in bash verwenden. Der Benutzer sollte seine eigenen Optionen auswählen. Die meisten Optionen erhalten Argumente, aber es gibt 2 Optionen, die kein Argument erhalten. Es funktioniert gut, wenn die Option ohne das Argument in der Mitte des Befehls ist, aber wenn es am Ende ist, funktioniert es nicht.Wie getopts Option ohne Argument am Ende in Bash

Hinweis - die ersten beiden Argumente (Server und Passwort) sind obligatorisch und kein Teil der 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 und -P sollte kein Argument erhalten. Wenn ich diesen Befehl ausführen es richtig (-F in der Mitte) arbeitet:

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

Wenn die -F oder -P am Ende des Befehls ist, Diese Zeile funktioniert nicht richtig (alles funktioniert gut, aber die F):

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

Antwort

6

die Doppelpunkte aus den Optionen entfernen, die Argumente nicht benötigen, und tun nicht manuell jede Verschiebung oder Änderung von OPTIND sich im while/case statment (Sie noch brauchen Setzen Sie OPTIND vor der while-Schleife, um die ersten beiden Argumente zu überspringen):

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

Ich habe für die P und F Optionen sowie für H die while Linie mit den entsprechenden Änderungen dargestellt, da es wäre auch kein Argument erforderlich.

Per the documentation:

, wenn ein Zeichen von einem Doppelpunkt folgt, wird die Option erwartet ein Argument haben

So ist die : nur dort mit Argumenten für Optionen sein sollte.

+0

aber wenn ich so etwas ./deploy_test.sh server1 pass1234 -F es wird nie die while-Schleife gehen und ich mag, dass der FULL 1 – Nissim

+0

es funktioniert geändert werden tun! Vielen Dank. – Nissim

+0

Froh, dass es geklappt hat – Julian