2009-05-06 15 views
11

Ich brauche einen Bash-Skript, zu schreiben und möchte es ungeordnete Parameter des Formats analysieren:Bash-Skript Parameter

scriptname --param1 <string> --param2 <string> --param3 <date> 

Gibt es eine einfache Möglichkeit, dies zu tun, oder bin ich ziemlich viel stecken mit $ 1, $ 2, $ 3?

Antwort

10

Sie möchten getopts.

+5

getopts unterstützt keine langen Switches (beginnend mit -). getopt tut, aber es ist ziemlich schrecklich zu verwenden/lesen – Cameron

+0

Guter Punkt - wenn lange Schalter ein Must-Have sind, ist getopts nicht das richtige Werkzeug. –

+2

Diese Antwort wäre besser mit Inhalt und oder Beispiel, anstatt nur ein Link. –

1

Bash hat eine getops-Funktion, wie bereits erwähnt, die Ihre Probleme lösen könnte.

Wenn Sie etwas anspruchsvolleres benötigen, unterstützt Bash auch Positionsparameter (geordnet $ 1 ... $ 9, und dann $ {10} .... $ {n}), Sie müssen sich Ihre eigenen überlegen Logik, um diese Eingabe zu verarbeiten. Ein einfacher Weg zu gehen ist, einen Schalter/Fall innerhalb einer for-Schleife zu setzen und über die Parameter zu iterieren. Sie können einen der beiden speziellen bash vars verwenden, die die Eingabe verarbeiten: $* or [email protected].

8
while [[ $1 = -* ]]; do 
    arg=$1; shift   # shift the found arg away. 

    case $arg in 
     --foo) 
      do_foo "$1" 
      shift   # foo takes an arg, needs an extra shift 
      ;; 
     --bar) 
      do_bar   # bar takes no arg, doesn't need an extra shift 
      ;; 
    esac 
done 
+0

Sollte do_foo "$ 2" nicht do_foo "$ 1" sein? – xx77aBs

+0

@ xx77aBs ja, sollte es! – lhunath

0
#!/bin/bash 

# Parse the command-line arguments 
while [ "$#" -gt "0" ]; do 
    case "$1" in 
    -p1|--param1) 
     PARAM1="$2" 
     shift 2 
    ;; 
    -p2|--param2) 
     PARAM2="$2" 
     shift 2 
    ;; 
    -p3|--param3) 
     PARAM3="$2" 
     shift 2 
    ;; 
    -*|--*) 
     # Unknown option found 
     echo "Unknown option $1." 

     exit 1 
    ;; 
    *) 
     CMD="$1" 
     break 
    ;; 
    esac 
done 


echo "param1: $PARAM1, param2: $PARAM2, param3: $PARAM3, cmd: $CMD" 

Als ich dies ausführen:

./<my-script> --param2 my-param-2 --param1 myparam1 --param3 param-3 my-command 

es gibt was Sie erwarten:

param1: myparam1, param2: my-param-2, param3: param-3, cmd: my-command 
Verwandte Themen