2014-04-07 11 views
5

Ich bin ziemlich neu zu Ubuntu und Bash Scripting und wollte wissen, warum ich diesen Fehler bekommen könnte, wenn Sie GETOPTS verwenden.neu zu Bash - immer Illegal Option Fehler

Hier ist der Code, den ich verwende, um es auszuführen.

Ich denke, ich rufe das Skript richtig, und es sollte nach dem Begriff suchen, den ich als einen Suchbegriff mit Hilfe von Grap eingeben. aber aus irgendeinem Grund nicht. Jeder Ratschlag, was ich als allgemeine Regel bei der Arbeit mit Grep tun kann, wäre ebenfalls dankbar, danke.

#!/bin/bash 

valid=0 
file_arg="" 
display_help="" 
column="" 
pattern="" 

while getopts f:d:s:m: opt 
do 
    case "$opt" in 
     d) display_help=$OPTARG 
      ;; 
     f) file_arg=$OPTARG 
      ;; 
     c) column=$OPTARG 
      ;; 
     p) pattern=$OPTARG 
      ;; 
     *) valid=1 
      break 
      ;; 
    esac 
done 

if [ $valid -eq "0" ] 
then 
    if [ $pattern != "" ] 
    then 
     cat $file_arg | grep $pattern 
    else 
     cat $file 
    fi 
else 
    echo -n "Usage: FILE -f <name> | COLUMN -> -c <name> | HELP -> -d | PATTERN -> -p <expression>" 
fi 

Antwort

10

In getopts Sie nicht p Option geben Sie f:d:s:m: Optionen nur haben.

Ich denke, Sie meinen statt m oder umgekehrt.

Es sollte f:d:s:m:p: oder f:d:s:p:

+0

Danke mann, sehr geschätzt! – Duenna

+0

@Duenna Sie sind willkommen. –

2

Es gibt ein paar andere Probleme mit Ihrem Skript, wie Jayesh erwähnt, müssen Sie alle Parameter für getopt enthalten, aber Sie müssen auch mit String-Vergleiche vorsichtig sein, hier ist ein Paar weitere Korrekturen Vorschläge:

(Siehe http://www.tldp.org/LDP/abs/html/comparison-ops.html für String-Vergleich info)

#!/bin/bash 

# switch around valid, convention is 1 == true and 0 == false 
valid=1 
file_arg="" 
display_help="" 
column="" 
pattern="" 

# getopt patterns need to match following case statement 
while getopts f:d:c:p: opt; 
do 
    case $opt in 
     d) display_help=$OPTARG 
      ;; 
     f) file_arg=$OPTARG 
      ;; 
     c) column=$OPTARG 
      ;; 
     p) pattern=$OPTARG 
      ;; 
     *) valid=0 
      break 
      ;; 
    esac 
done 

# changed value to reflect true false convention 
if [ "$valid" -eq "1" ] 
then 
    # string comparison in bash should be done using specific operators 
    if [ -n "$pattern" ] 
    then 
     cat $file_arg | grep $pattern 
    else 
     # typo, this should be file_arg? 
     cat $file_arg 
    fi 
else 
    echo -n "Usage: FILE -f <name> | COLUMN -> -c <name> | HELP -> -d | PATTERN -> -p <expression>" 
fi 
3

Sie auch die Fehlerausblendung und Fehlerbehandlung von Funktionen in Betracht ziehen sollten getopts.

Wenn die erste Zeichen der Option String ist ein Doppelpunkt (:) dann getopts nicht Fehler berichten und bieten stattdessen ein Mittel, um die Fehler der Umgang mit sich selbst. Zwei zusätzliche Zeichen können dann in Ihrem Fall bedingte Handhabung verwendet werden:

  • ? Wenn eine ungültige Option eingegeben wird dann $opt werden ? und $OPTARG gesetzt wird, um die ungültigen Zeichen halten, z.B. Wenn -z verwendet wurde, was nicht in der Optionszeichenfolge enthalten ist, wird $OPTARG auf z festgelegt.

  • : Wenn ein erforderliches zusätzliches Argument wird durch den Benutzer ausgelassen wird dann zu $opt:$OPTARG und eingestellt wird, um die Befehlszeichen halten, z.B. Wenn -p anstelle von -p arg verwendet wurde, wird $OPTARG auf gesetzt.

Wenn diese dann umgesetzt wird, die catch-all * wird überflüssig und sollte entfernt werden. Hinweis: Wenn Sie es verlassen und es entweder über ? oder : ist, dann werden Sie nach Problemen fragen. Stellen Sie außerdem sicher, dass die ? wie diese \?) wie folgt ausgeblendet wird.

Hoffe, das hilft.

# Note the addition of the inital colon before 'f'. 
while getopts :f:d:c:p: opt; 
do 
    case $opt in 
     d) display_help=$OPTARG 
      ;; 
     f) file_arg=$OPTARG 
      ;; 
     c) column=$OPTARG 
      ;; 
     p) pattern=$OPTARG 
      ;; 

     # Option error handling. 

     \?) valid=0 
      echo "An invalid option has been entered: $OPTARG" 
      ;; 

     :) valid=0 
      echo "The additional argument for option $OPTARG was omitted." 
      ;; 

     # This is now redundant: 
     # *) valid=0 
     #  break 
     #  ;; 
    esac 
done 
+1

Wenn das '?' Nicht maskiert ist, stimmt es mit allem überein, und Sie gelangen nie in den ':' Fall, so dass fehlende Argumente als ungültige Optionen gemeldet werden. –

+0

Danke für die Klarstellung Mark. Nützliches Wissen. – mattst

Verwandte Themen