2015-12-27 7 views
5

Voglio utilizzare getopts in bash. L'utente deve selezionare le proprie opzioni. la maggior parte delle opzioni ottiene argomenti ma ci sono 2 opzioni che non ottengono un argomento. Funziona bene quando l'opzione senza argomento è al centro del comando, ma quando è alla fine non funziona.Come utilizzare l'opzione getopts senza argomento alla fine in bash

Nota: i primi due argomenti (server e password) sono obbligatori e non fanno parte dei 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 e -P non dovrebbero ottenere un argomento. Quando ho eseguito questo comando funziona correttamente (-F al centro):

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

Quando il -F o -P sono alla fine del comando, Questa linea non funziona correttamente (tutto funziona bene, ma il -F):

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

risposta

6

Rimuovere i due punti tra le opzioni che non richiedono argomenti, e non fare manualmente qualsiasi spostamento o la modifica di OPTIND te stesso all'interno del while/case statment (sarà ancora bisogno per impostare OPTIND prima del ciclo while per saltare i primi 2 argomenti):

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

ho mostrato la linea while con le opportune modifiche per le opzioni P e F così come per H poiché, inoltre, non richiederebbe un argomento.

Secondo the documentation:

se un personaggio è seguito da due punti, l'opzione si prevede di avere un argomento

Così l': dovrebbe solo essere lì per le opzioni con argomenti.

+0

ma se riuscirò a fare qualcosa di simile ./deploy_test.sh server1 pass1234 -F non potrà mai andare in ciclo while e voglio FULL per essere cambiato in 1 – Nissim

+0

funziona! Grazie. – Nissim

+0

Felice che tu abbia capito – Julian

Problemi correlati