Die akzeptierte Antwort weist sehr schön auf alle Unzulänglichkeiten der eingebauten Bash hin getopts
. Die Antwort endet mit:
Es ist zwar möglich, mehr Code zu schreiben, um die fehlende Unterstützung für lange Optionen zu umgehen, aber das ist viel mehr Arbeit und verfehlt teilweise den Zweck der Verwendung eines getopt-Parsers zur Vereinfachung Ihres Codes.
Und obwohl ich dieser Aussage grundsätzlich zustimme, bin ich der Meinung, dass die Anzahl der von uns allen in verschiedenen Skripten implementierten Funktionen es rechtfertigt, ein wenig Aufwand in die Schaffung einer "standardisierten", gut getesteten Lösung zu investieren.
Daher habe ich die Bash "aufgerüstet", die in getopts
durch die Umsetzung getopts_long
in reiner Bash, ohne externe Abhängigkeiten. Die Verwendung der Funktion ist 100% kompatibel mit der eingebauten getopts
.
Durch die Einbeziehung getopts_long
(das ist gehostet auf GitHub ) in ein Skript einfügen, kann die Antwort auf die ursprüngliche Frage so einfach wie folgt implementiert werden:
source "${PATH_TO}/getopts_long.bash"
while getopts_long ':c: copyfile:' OPTKEY; do
case ${OPTKEY} in
'c'|'copyfile')
echo 'file supplied -- ${OPTARG}'
;;
'?')
echo "INVALID OPTION -- ${OPTARG}" >&2
exit 1
;;
':')
echo "MISSING ARGUMENT for option -- ${OPTARG}" >&2
exit 1
;;
*)
echo "Misconfigured OPTSPEC or uncaught option -- ${OPTKEY}" >&2
exit 1
;;
esac
done
shift $(( OPTIND - 1 ))
[[ "${1}" == "--" ]] && shift