2012-07-01 13 views
27

¿Es posible usar getopts para procesar múltiples opciones juntas? Por ejemplo, myscript -iR o myscript -irv.bash getopts con opciones múltiples y obligatorias

Además, tengo una situación en la que basándome en un script de condición necesitaría la opción obligatoria. Por ejemplo, si argument to script es un directorio, necesitaré especificar la opción -R o -r junto con cualquier otra opción (myscript -iR mydir o myscript -ir mydir o myscript -i -r mydir o myscript -i -R mydir), en el caso del archivo solo -i es suficiente (myscript -i miarchivo).

He intentado buscar pero no recibí ninguna respuesta.

Respuesta

73

Puede concatenar las opciones que proporcione y getopts las separará. En su declaración case manejará cada opción individualmente.

Puede establecer un indicador cuando se vean las opciones y verificar que haya "opciones" obligatorias (!) Después de completar el ciclo getopts.

Aquí se muestra un ejemplo:

#!/bin/bash 
rflag=false 
small_r=false 
big_r=false 

usage() { echo "How to use"; } 

options=':ij:rRvh' 
while getopts $options option 
do 
    case $option in 
     i ) i_func;; 
     j ) j_arg=$OPTARG;; 
     r ) rflag=true; small_r=true;; 
     R ) rflag=true; big_r=true;; 
     v ) v_func; other_func;; 
     h ) usage; exit;; 
     \?) echo "Unknown option: -$OPTARG" >&2; exit 1;; 
     : ) echo "Missing option argument for -$OPTARG" >&2; exit 1;; 
     * ) echo "Unimplemented option: -$OPTARG" >&2; exit 1;; 
    esac 
done 

shift $(($OPTIND - 1)) 

if ! $rflag && [[ -d $1 ]] 
then 
    echo "-r or -R must be included when a directory is specified" >&2 
    exit 1 
fi 

Esto representa una implementación de referencia completa de una función getopts, pero es sólo un boceto de un guión más grande.

+1

Muchas gracias Dennis. He usado las banderas como sugirió. Traté de simplificar la lógica al concatenar opciones y almacenarlas en una variable y luego hacer el procesamiento en función de las opciones proporcionadas. –

+0

@RameshSamane: De nada. Si crees que mi respuesta fue útil, márcala como aceptada. –

+0

Ya lo intenté, pero recibir el mensaje "Vota requiere 15 de reputación". Sin embargo, hice clic en "Sí" en la parte inferior del hilo para la pregunta "¿Te resultó útil esta publicación?" y recibí el mensaje "Gracias por tus comentarios". –

Cuestiones relacionadas