Mehrere Optionsargumente mit getopts in Bash

Mehrere Optionsargumente mit getopts in Bash

Ich versuche, Befehlszeilenargumente getoptsin Bash zu verarbeiten. Eine der Anforderungen ist die Verarbeitung einer beliebigen Anzahl optionaler Argumente (ohne Verwendung von Anführungszeichen).

1. Beispiel (greift nur auf das 1. Argument zurück)

madcap:~/projects$ ./getoptz.sh -s a b c
-s was triggered
Argument: a

2. Beispiel (Ich möchte, dass es sich so verhält, aber ohne das Argument zitieren zu müssen"

madcap:~/projects$ ./getoptz.sh -s "a b c"
-s was triggered
Argument: a b c

Gibt es eine Möglichkeit, dies zu tun?

Hier ist der Code, den ich jetzt habe:

#!/bin/bash
while getopts ":s:" opt; do
    case $opt in
    s) echo "-s was triggered" >&2
       args="$OPTARG"
       echo "Argument: $args"
       ;;
       \?) echo "Invalid option: -$OPTARG" >&2
       ;;
    :) echo "Option -$OPTARG requires an argument." >&2
       exit 1
       ;;
    esac
done

Beachten Sie, dass ich auf diese Weise mehrere Flags unterstützen möchte, z. B.

madcap:~/projects$ ./getoptz.sh -s a b c -u 1 2 3 4
-s was triggered
Argument: a b c
-u was triggered
Argument: 1 2 3 4

Antwort1

Ich denke, der beste Weg ist die Verwendung von -s für jedes Argument, d. h -s foo -s bar -s baz.AberWenn Sie dennoch mehrere Argumente für eine einzige Option unterstützen möchten, schlage ich vor,nichtverwenden getopts.

Bitte schauen Sie sich das folgende Skript an:

#!/bin/bash

declare -a sargs=()

read_s_args()
{
    while (($#)) && [[ $1 != -* ]]; do sargs+=("$1"); shift; done
}

while (($#)); do
    case "$1" in
        -s) read_s_args "${@:2}"
    esac
    shift
done

printf '<%s>' "${sargs[@]}"

Wenn -serkannt wird, read_s_argswird es mit den verbleibenden Optionen und Argumenten in der Befehlszeile aufgerufen. read_s_argsliest seine Argumente, bis es die nächste Option erreicht. Gültige Argumente für -s werden im sargsArray gespeichert.

Hier ist einBeispielausgabe:

[rany$] ./script -s foo bar baz -u a b c -s foo1 -j e f g
<foo> <bar> <baz> <foo1>
[rany$]

verwandte Informationen