2009-05-06 18 views
11

Tengo que escribir un guión fiesta, y me gustaría que analice parámetros sin ordenar del formato:escritura del golpe parámetros

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

¿Hay una manera sencilla de lograr esto, o estoy bastante mucho atrapado con $ 1, $ 2, $ 3?

Respuesta

10

Quiere getopts.

+5

getopts no admite conmutadores largos (comenzando con -). getopt sí, pero es bastante horrible usar/leer – Cameron

+0

Buen punto: si los switches largos son obligatorios, getopts no es la herramienta adecuada. –

+2

Esta respuesta sería mejor con el contenido y/o el ejemplo, en lugar de solo un enlace. –

1

Bash tiene una función getops, como se mencionó anteriormente, que podría resolver sus problemas.

Si necesita algo más sofisticado, bash también admite parámetros posicionales (ordenados $ 1 ... $ 9, y luego $ {10} ... $ {n}), tendrá que idear el suyo lógica para manejar esta entrada. Una manera fácil de hacerlo es colocar un interruptor/caja dentro de un ciclo for, iterando sobre los parámetros. Puede usar cualquiera de los dos bash vars especiales que manejan la entrada: $* 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

¿No debería do_foo "$ 2" ser do_foo "$ 1"? – xx77aBs

+0

@ xx77aBs sí, debería! – 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" 

Cuando ejecuto esto:

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

emite lo que espera:

param1: myparam1, param2: my-param-2, param3: param-3, cmd: my-command 
Cuestiones relacionadas