GNU/Linux >> Linux Esercitazione >  >> Linux

Fornire due argomenti a un'opzione utilizzando Getopts?

Nel codice sottostante quando do l'opzione r quindi getopts richiede un argomento:

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

Ma ho bisogno di passare due argomenti dopo -r opzione, invece di una. C'è un modo semplice per farlo?

Risposta accettata:

Non puoi passare due argomenti con una singola opzione usando getopts .

Consiglio le seguenti alternative:

  1. Metti tra virgolette più argomenti

    In questo caso getopts li tratterà come un argomento, ma potrai dividerlo in un secondo momento. Puoi anche inserire tutti gli argomenti nell'array contemporaneamente:

    #!/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"
    

    L'esempio di eseguire:

    ./script -r "123 456 789"
    

    E uscita:

    Run Numbers - argument = 123 456 789 
    Number of arguments: 3
    Arguments are: 123, 456, 789
    
  2. Utilizza la virgola (o altro carattere preferito) come delimitatore

    ./script -r 123,456,789
    

    e sostituisci semplicemente IFS=" " con IFS=, nel codice sopra. Quello ha il vantaggio di consentire elementi vuoti.
    Come sottolineato nella sezione commenti questa soluzione è scelta da alcuni programmi comuni ad es. lsblk -o NAME,FSTYPE,SIZE .

  3. Consenti -r multipli opzioni

    -r multipli , ma ognuno con un solo argomento:

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

    Quindi gli argomenti verrebbero aggiunti all'array uno per uno

    array+=("$OPTARG")
    

    Quello ha il vantaggio di non avere limitazioni su quali caratteri possono contenere gli elementi.
    Questo è usato anche da alcuni strumenti linux standard, ad es. awk -v var1=x -v var2=y .


Linux
  1. Stampa linee tra (ed escludendo) due motivi?

  2. Debian:utilizzo di due display su Debian?

  3. È possibile installare due servizi per un pacchetto utilizzando Dh_installinit? Come?

  4. Come sostituire tutti i punti e virgola dopo il primo?

  5. Sincronizzare due tipi di file in un comando?

Bash Scripting – Analizza gli argomenti negli script Bash usando getopts

Utilizzo del comando Diff per confrontare due file nel terminale Linux

Unisci manualmente due file usando diff

Due utenti possono condividere contemporaneamente un pc

Due punti di montaggio distinti con un dispositivo

Utilizzo di bridge utils per connettere due computer tramite Linux