GNU/Linux >> Tutoriales Linux >  >> Linux

¿Proporcionar dos argumentos a una opción usando Getopts?

En el siguiente código cuando doy la opción r entonces getopts requiere un argumento:

while getopts ":hr::l:" opt; do
    case $opt in
        r ) echo "Run Numbers - argument = $OPTARG " ;;
        l ) echo "Latency range - argument = $OPTARG" ;;
        h ) helptext
            graceful_exit ;;
        * ) usage
            clean_up
            exit 1
    esac
done

Pero necesito pasar dos argumentos después de -r opción, en lugar de uno. ¿Hay una manera fácil de hacer esto?

Respuesta aceptada:

No puede pasar dos argumentos con una sola opción usando getopts .

Recomiendo las siguientes alternativas:

  1. Ponga comillas alrededor de múltiples argumentos

    En este caso, getopts los tratará como un solo argumento, pero podrá dividirlo más adelante. Incluso puede poner todos los argumentos en la matriz a la vez:

    #!/bin/bash  
    
    while getopts ":hr:l:" opt; do
        case $opt in
            r ) echo "Run Numbers - argument = $OPTARG "
                set -f # disable glob
                IFS=' ' # split on space characters
                array=($OPTARG) ;; # use the split+glob operator
            l ) echo "Latency range - argument = $OPTARG" ;;
            h ) helptext
                graceful_exit ;;
            * ) usage
                clean_up
                exit 1
        esac
    done
    
    echo "Number of arguments: ${#array[@]}"
    echo -n "Arguments are:"
    for i in "${array[@]}"; do
      echo -n " ${i},"
    done
    printf "b n"
    

    El ejemplo de ejecución:

    ./script -r "123 456 789"
    

    Y salida:

    Run Numbers - argument = 123 456 789 
    Number of arguments: 3
    Arguments are: 123, 456, 789
    
  2. Usar coma (u otro carácter preferido) como delimitador

    ./script -r 123,456,789
    

    y simplemente reemplaza IFS=" " con IFS=, en el código de arriba. Ese tiene la ventaja de permitir elementos vacíos.
    Como se señaló en la sección de comentarios, esta solución es elegida por algunos programas comunes, p. lsblk -o NAME,FSTYPE,SIZE .

  3. Permitir múltiples -r opciones

    Múltiples -r , pero cada uno tomando solo un argumento:

    ./script -r 123 -r 456 -r 789
    

    Luego, los argumentos se agregarían a la matriz uno por uno

    array+=("$OPTARG")
    

    Ese tiene la ventaja de no tener limitaciones sobre qué caracteres pueden contener los elementos.
    Este también es utilizado por algunas herramientas estándar de Linux, p. awk -v var1=x -v var2=y .


Linux
  1. ¿Imprimir líneas entre (y excluyendo) dos patrones?

  2. ¿Cómo reemplazar todos los puntos y comas después del primero?

  3. Tar ¿Usando la opción de formato corto versus el estilo antiguo?

  4. 8 impresionantes argumentos de la línea de comandos de Perl que debe conocer

  5. ¿Cómo fusionar dos archivos usando AWK?

Bash Scripting:analizar argumentos en Bash Scripts usando getopts

Uso del comando Diff para comparar dos archivos en la terminal de Linux

¿Cómo fusionar dos bibliotecas estáticas ar en una?

Une dos cadenas en una línea con grep

Obtener 2 direcciones IP en una tarjeta de red, usando DHCP

Uso de Bridge Utils para conectar dos computadoras a través de Linux