2016-04-20 2 views
1

Ich versuche getopt zu verwenden, um lange Argumente zu parsen (einige davon sind obligatorisch und andere nicht). Der Code:Die Verwendung von getopt zum Parsen langer Argumente überspringt den ersten Wert

#!/bin/bash 

# firstName is compulsory, age is not and lastName is again compulsory. 

OPTS=`getopt --long firstName:,age::,lastName: -n 'longArgumentsParsing' -- "[email protected]"` 

if [ $? != 0 ] ; then echo "Failed parsing options." >&2 ; exit 1 ; fi 

#echo "$OPTS" 
eval set -- "$OPTS" 

while true; do 
    echo "Argument seen: $1"; 
    echo "And value seen: $2"; 
    case "$1" in 

    --firstName) echo "First name: $2"; shift 2; 
     ;; 

    --lastName) 
     echo "Last Name: $2"; 
     shift 2; 
     ;; 

    --age) if [ -z "$2" ]; 
      then 
       echo "Age is not specified."; 
      else 
       echo "Age specifed: $2"; shift 2; 
      fi 
      ;; 

    --) shift; break ;; 

    *) break ;; 
    esac 
done 

Jedes Mal, wenn ich es laufe mit ./longArgumentsParsing --firstName sriram --age 30 das Programm mit der folgenden Ausgabe beendet:

Argument seen: sriram 
And value seen: --lastName 

Das Programm ist eindeutig nicht in der Lage die Eingabe-Taste und Argument Wert-Paare richtig zu analysieren. Warum? Wo gehe ich falsch?

UPDATE:

Per this answer habe ich versucht, diese selbst zu debuggen: in der Befehlszeile:
set -- --firstName sriram --lastName shankar und dann:
OPTS=$(getopt -l firstName:,lastName: -- "[email protected]");
die Ausgabe zu erhalten:
echo $?; echo "$OPTS"
0 'sriram' --lastName 'shankar' --

Meine Fragen:
1. Wie kann ich das oben genannte richtig finden?
2. Ich habe das optionale Argument entfernt (was ich nicht tun möchte), und bekomme immer noch den Fehler.

Antwort

0

Es gibt zwei Probleme in den obigen Code:

  1. Das Skript nur lange Argumente analysiert. Der korrekte Aufruf von getopt, falls man nur lange Argumenten ist folgendes:

OPTS = $ (getopt -o '' -l "vorName:, nachName:, Alter ::" - "$ @");

Beachten Sie die '' neben der -o Flag. Getopt erfordert, dass das Flag -o leer gelassen wird, wenn keine Kurzformargumente vorliegen.

  1. Argumente für dieses Skript müssen mit dem Zeichen = angegeben werden.
    Ein Beispielaufruf des Skripts wäre:
    ./longArgumentsParsing.bash --firstName=sriram --lastName=shankar --age=30.
Verwandte Themen