
Ich versuche, Befehlszeilenargumente getopts
in 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 -s
erkannt wird, read_s_args
wird es mit den verbleibenden Optionen und Argumenten in der Befehlszeile aufgerufen. read_s_args
liest seine Argumente, bis es die nächste Option erreicht. Gültige Argumente für -s werden im sargs
Array 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$]