Estoy tratando de utilizar getopts en bash para analizar los argumentos de línea de comandos, pero no pude averiguar cómo implementar el «defecto» de la acción, si no hay argumento que fue igualada (o no cmdline argumento).

Este es silghtly versión simplificada de lo que he probado hasta ahora:

while getopts v:t:r:s:c: name;
do
        case $name in
        v) VALIDATE=1;;
        t) TEST=1;;
        r) REPORT=1;;
        s) SYNC=1;;
        c) CLEAR=1;;
        *) print_help; exit 2;;
        \?) print_help; exit 2;;
        esac
done

Hay ninguna (simple) de manera que llame print_help; exit 2; en la no coincidencia de la entrada?

InformationsquelleAutor pruzinat | 2012-03-21

4 Comentarios

  1. 4

    Buscando entre su pregunta y los comentarios de Aditya la respuesta, me gustaría recomendar el siguiente:

    [getopts]$ cat go
    #!/bin/bash
    
    function print_help { echo "Usage" >&2 ; } 
    
    while getopts vtrsc name; do
        case $name in
            v) VALIDATE=1;;
            t) TEST=1;;
            r) REPORT=1;;
            s) SYNC=1;;
            c) CLEAR=1;;
            ?) print_help; exit 2;;
        esac
    done
    
    echo "OPTIND: $OPTIND"
    echo ${#@}
    
    shift $((OPTIND - 1))
    
    while (( "$#" )); do
        if [[ $1 == -* ]] ; then
            echo "All opts up front, please." >&2 ; print_help ; exit 2
        fi
        echo $1
        shift
    done

    Ya que cada uno de ellos son indicador booleano opciones, no es necesario (y de hecho, no quieren) los argumentos, así que deshacerse de los dos puntos. Ninguno de estos personajes son en IFS, por lo que no necesitamos para envolver que en las cotizaciones, será una señal para getopts de todos modos.

    Siguiente, podemos cambiar el \? a una sola ? y deshacerse de la *, como el * haría coincidir antes de que el literal \?, y bien podríamos combinar las reglas en un solo defecto partido. Esta es una buena cosa, ya que cualquier opción especificada con un - prefijo debe ser una opción, y los usuarios esperan que el programa producirá un error si se especifica una opción que usted no espera.

    getopts analizará hasta el primero que no es un argumento, y establecer OPTIND a la posición del valor. En este caso, vamos a cambio OPTIND - 1 (ya que se opta 0 reajustables) de la parte frontal. Vamos a recorrer a través de los argumentos por el cambio de las mismas, haciéndose eco de ellos o en su defecto si comienzan con una -.

    Y a prueba:

    [getopts]$ ./go
    OPTIND: 1
    0
    [getopts]$ ./go -t -v go go
    OPTIND: 3
    4
    go
    go
    [getopts]$ ./go -d -v go go
    ./go: illegal option -- d
    Usage
    [getopts]$ ./go -t go -v go -d
    OPTIND: 2
    5
    go
    All opts up front, please.
    Usage
  2. 3

    Pruebe la solución siguiente:

    # Parse the arguments.
    while getopts ':h?f:' opts; do
      case ${opts} in
    
        f) # Foo argument.
          ;;
    
        # My other arguments.
    
        \? | h | *) # Prints help.
          grep " .)\ #" $0
          exit 0
          ;;
      esac
    done

    Así que, básicamente, -? /-h imprima los parámetros con los comentarios basados en su propia fuente. La especificación de : antes de opciones de impresión de ayuda para cualquier otro argumento desconocido también.

    • Bonito utilización de grep. Ahorra el tiempo de escribir una impresión de la función de ayuda. Yo tenía necesidad de añadir «h\»? a la arg lista para evitar illegal option de salida, aunque.
  3. 2

    v:t:r:s:c: debe estar entre comillas dobles

     "v:t:r:s:c:"

    Basado en el script que has publicado, tal vez no es necesario que todos los puntos :

    También no necesita *)

    • Gracias, hay alguna forma para que coincida también «no-argumentos», por ejemplo,». /script asdf»?
    • No sé de la parte superior de mi cabeza. hice la prueba con la actualización de la secuencia de comandos?
    • Cuando getopts devuelve, OPTIND se establece en el índice de la primera no-argumento de opción.
    • Esa cadena no necesita para ser citado, ya que no contiene espacios en blanco.
  4. 1

    Que usted necesita para proporcionar un líder de colon en el getopts de la cadena de opciones si desea habilitar ? para que coincida con un inválido opción — :vtrsc. También usted no necesita la barra invertida antes de la ?

Dejar respuesta

Please enter your comment!
Please enter your name here