Ein weiterer Optionsparser (Generator)
Ein eleganter Optionsparser für Shell-Skripte (volle Unterstützung für alle POSIX-Shells) https://github.com/ko1nksm/getoptions (Update: v3.3.0 veröffentlicht am 2021-05-02)
getopt ist ein neuer Optionsparser (Generator), der in einem POSIX-konformen Shell-Skript geschrieben und im August 2020 veröffentlicht wurde. Es ist für diejenigen, die die POSIX / GNU-Stil Option Syntax in Ihren Shell-Skripten unterstützen wollen.
Die unterstützten Syntaxen sind -a
, +a
, -abc
, -vvv
, -p VALUE
, -pVALUE
, --flag
, --no-flag
, --with-flag
, --without-flag
, --param VALUE
, --param=VALUE
, --option[=VALUE]
, --no-option
--
.
Es unterstützt Unterbefehle, Validierung, abgekürzte Optionen und automatische Hilfegenerierung. Und funktioniert mit allen POSIX-Shells (dash 0.5.4+, bash 2.03+, ksh88+, mksh R28+, zsh 3.1.9+, yash 2.29+, busybox ash 1.1.3+, etc).
#!/bin/sh
VERSION="0.1"
parser_definition() {
setup REST help:usage -- "Usage: example.sh [options]... [arguments]..." ''
msg -- 'Options:'
flag FLAG -f --flag -- "takes no arguments"
param PARAM -p --param -- "takes one argument"
option OPTION -o --option on:"default" -- "takes one optional argument"
disp :usage -h --help
disp VERSION --version
}
eval "$(getoptions parser_definition) exit 1"
echo "FLAG: $FLAG, PARAM: $PARAM, OPTION: $OPTION"
printf '%s\n' "$@" # rest arguments
Es analysiert die folgenden Argumente:
example.sh -f --flag -p VALUE --param VALUE -o --option -oVALUE --option=VALUE 1 2 3
Und automatische Hilfegenerierung.
$ example.sh --help
Usage: example.sh [options]... [arguments]...
Options:
-f, --flag takes no arguments
-p, --param PARAM takes one argument
-o, --option[=OPTION] takes one optional argument
-h, --help
--version
Es ist auch ein Optionsparser-Generator, der den folgenden einfachen Optionsparser-Code erzeugt. Wenn Sie den generierten Code verwenden, brauchen Sie nicht getoptions
. Erzielen Sie echte Portabilität und keine Abhängigkeit.
FLAG=''
PARAM=''
OPTION=''
REST=''
getoptions_parse() {
OPTIND=$(($#+1))
while OPTARG= && [ $# -gt 0 ]; do
case $1 in
--?*=*) OPTARG=$1; shift
eval 'set -- "${OPTARG%%\=*}" "${OPTARG#*\=}"' ${1+'"$@"'}
;;
--no-*|--without-*) unset OPTARG ;;
-[po]?*) OPTARG=$1; shift
eval 'set -- "${OPTARG%"${OPTARG#??}"}" "${OPTARG#??}"' ${1+'"$@"'}
;;
-[fh]?*) OPTARG=$1; shift
eval 'set -- "${OPTARG%"${OPTARG#??}"}" -"${OPTARG#??}"' ${1+'"$@"'}
OPTARG= ;;
esac
case $1 in
'-f'|'--flag')
[ "${OPTARG:-}" ] && OPTARG=${OPTARG#*\=} && set "noarg" "$1" && break
eval '[ ${OPTARG+x} ] &&:' && OPTARG='1' || OPTARG=''
FLAG="$OPTARG"
;;
'-p'|'--param')
[ $# -le 1 ] && set "required" "$1" && break
OPTARG=$2
PARAM="$OPTARG"
shift ;;
'-o'|'--option')
set -- "$1" "$@"
[ ${OPTARG+x} ] && {
case $1 in --no-*|--without-*) set "noarg" "${1%%\=*}"; break; esac
[ "${OPTARG:-}" ] && { shift; OPTARG=$2; } || OPTARG='default'
} || OPTARG=''
OPTION="$OPTARG"
shift ;;
'-h'|'--help')
usage
exit 0 ;;
'--version')
echo "${VERSION}"
exit 0 ;;
--)
shift
while [ $# -gt 0 ]; do
REST="${REST} \"\${$(($OPTIND-$#))}\""
shift
done
break ;;
[-]?*) set "unknown" "$1"; break ;;
*)
REST="${REST} \"\${$(($OPTIND-$#))}\""
esac
shift
done
[ $# -eq 0 ] && { OPTIND=1; unset OPTARG; return 0; }
case $1 in
unknown) set "Unrecognized option: $2" "$@" ;;
noarg) set "Does not allow an argument: $2" "$@" ;;
required) set "Requires an argument: $2" "$@" ;;
pattern:*) set "Does not match the pattern (${1#*:}): $2" "$@" ;;
notcmd) set "Not a command: $2" "$@" ;;
*) set "Validation error ($1): $2" "$@"
esac
echo "$1" >&2
exit 1
}
usage() {
cat<<'GETOPTIONSHERE'
Usage: example.sh [options]... [arguments]...
Options:
-f, --flag takes no arguments
-p, --param PARAM takes one argument
-o, --option[=OPTION] takes one optional argument
-h, --help
--version
GETOPTIONSHERE
}
1 Stimmen
Für zsh-Benutzer gibt es ein großartiges builtin namens zparseopts, das das kann:
zparseopts -D -E -M -- d=debug -debug=d
Und haben beide-d
y--debug
im$debug
Arrayecho $+debug[1]
gibt 0 oder 1 zurück, wenn einer dieser Werte verwendet wird. Ref: zsh.org/mla/users/2011/msg00350.html2 Stimmen
Ein wirklich gutes Tutorial: linuxcommand.org/lc3_wss0120.php . Besonders gut gefällt mir das Beispiel "Befehlszeilenoptionen".
0 Stimmen
Ich habe ein Skript erstellt, das dies für Sie erledigt, es heißt - github.com/unfor19/bargs
2 Stimmen
Siehe auch Einem Bash-Skript die Möglichkeit geben, Flags zu akzeptieren, wie ein Befehl? für einen ausgeklügelten Ad-hoc-Parser für lange und kurze Optionen. Es wird nicht versucht, Optionsargumente zu behandeln, die an kurze Optionen angehängt sind, noch lange Optionen mit
=
die den Optionsnamen vom Optionswert trennt (in beiden Fällen wird einfach angenommen, dass der Optionswert im nächsten Argument steht). Es behandelt auch nicht die Clusterung von Kurzoptionen - die Frage brauchte das nicht.0 Stimmen
Diese tolle Anleitung von Baeldung zeigt 4 Möglichkeiten zur Verarbeitung von Kommandozeilenargumenten in der Bash, darunter: 1) Positionsbezogene Parameter
$1
,$2
, usw., 2) Flaggen mitgetopts
y${OPTARG}
3) Schleifenbildung über alle Parameter ($@
), und 4) Schleifenbildung über alle Parameter mit$#
,$1
und dieshift
Betreiber.0 Stimmen
Prüfen Sie die Lösung mit Bash Space-Separated: bigdata-etl.com/bash-parse-input-arguments-funtions-parameters