GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Geben Sie zwei Argumente für eine Option mit Getopts an?

Im folgenden Code, wenn ich die Option r gebe dann getopts erfordert ein Argument:

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

Aber ich muss zwei Argumente nach -r übergeben Option, statt einer. Gibt es eine einfache Möglichkeit, dies zu tun?

Akzeptierte Antwort:

Sie können mit getopts nicht zwei Argumente mit einer einzigen Option übergeben .

Ich empfehle folgende Alternativen:

  1. Setzen Sie mehrere Argumente in Anführungszeichen

    In diesem Fall behandelt getopts sie als ein Argument, aber Sie können es später aufteilen. Sie können sogar alle Argumente auf einmal in das Array einfügen:

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

    Das Beispiel von run:

    ./script -r "123 456 789"
    

    Und Ausgabe:

    Run Numbers - argument = 123 456 789 
    Number of arguments: 3
    Arguments are: 123, 456, 789
    
  2. Komma (oder ein anderes bevorzugtes Zeichen) als Trennzeichen verwenden

    ./script -r 123,456,789
    

    und Sie ersetzen einfach IFS=" " mit IFS=, im Code oben. Das hat den Vorteil, leere Elemente zuzulassen.
    Wie im Kommentarbereich erwähnt, wird diese Lösung von einigen gängigen Programmen gewählt, z. lsblk -o NAME,FSTYPE,SIZE .

  3. Mehrere -r zulassen Optionen

    Mehrere -r , aber jeweils nur ein Argument:

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

    Dann würden die Argumente nacheinander zum Array hinzugefügt

    array+=("$OPTARG")
    

    Das hat den Vorteil, dass es keine Einschränkungen gibt, welche Zeichen die Elemente enthalten dürfen.
    Dieses wird auch von einigen Standard-Linux-Tools verwendet, z. awk -v var1=x -v var2=y .


Linux
  1. Linien zwischen (und ausschließenden) zwei Mustern drucken?

  2. Debian – Verwenden von zwei Displays unter Debian?

  3. 8 fantastische Perl-Befehlszeilenargumente, die Sie kennen sollten

  4. Suchen nach einer bestimmten Option in einer Manpage

  5. Erhalten von 2 IP-Adressen auf einer Netzwerkkarte mit DHCP

Bash-Skripting – Analysieren Sie Argumente in Bash-Skripten mithilfe von getopts

Einen Befehl mit Argumenten ausführen, die aus einem Array stammen?

Tar mit Kurzformoption im Vergleich zum alten Stil?

Verwenden des Diff-Befehls zum Vergleichen zweier Dateien im Linux-Terminal

Zwei unterschiedliche Mount-Punkte mit einem Gerät

Verwenden von Bridge-Dienstprogrammen, um zwei Computer über Linux zu verbinden