
Die meisten Shell-Skripte, die ich verwende, haben eine Syntax wie
./shellscript.sh -first_argument_flag <first_argument_value> -second_argument_flag <second_argument_value>
aber alle Online-Ressourcen für Shell-Skripter diskutieren nur die Übergabe von Positionsargumenten wie
./shellscript.sh <first_argument_value> <second_argument_value>
die anschließend im Skript als "$1"
, "$2"
, usw. verwendet werden.
Ich möchte die erste, benutzerfreundlichere Syntax anstelle der Positionsargument-Syntax verwenden. Nehmen wir als Beispiel an, ich möchte einen Dateinamen mit dem Flag -f und ein Verzeichnis mit dem Flag -d ausgeben. Nennen Sie dieses Skript echofd.sh. Ich möchte
./echofd.sh -f myfile.txt -d /my/directory/
um die Ausgabe zu erzeugen
Ihre Datei ist: myfile.txt
Ihr Verzeichnis ist: /mein/Verzeichnis/
und zwar unabhängig davon, in welcher Reihenfolge -f und -d beim Aufruf des Skripts stehen.
Antwort1
Da ist diegetopts
Standard-Dienstprogramm (integriert)in POSIX-Shells zum Parsen von Befehlszeilenargumenten.
Sie können diese Vorlage verwenden:
#! /bin/sh -
PROGNAME=$0
usage() {
cat << EOF >&2
Usage: $PROGNAME [-v] [-d <dir>] [-f <file>]
-f <file>: ...
-d <dir>: ...
-v: ...
EOF
exit 1
}
dir=default_dir file=default_file verbose_level=0
while getopts d:f:v o; do
case $o in
(f) file=$OPTARG;;
(d) dir=$OPTARG;;
(v) verbose_level=$((verbose_level + 1));;
(*) usage
esac
done
shift "$((OPTIND - 1))"
echo Remaining arguments: "$@"
Dadurch werden die Argumente auf die übliche Weise analysiert, wie es auch bei anderen Standardbefehlen der Fall wäre. Sie können es beispielsweise so aufrufen:
myscript -vvv -f file -d dir other arg
myscript -ffile -ddir -- other arg
Sehendie POSIX-Spezifikationoder Ihr Shell-Handbuch für weitere Einzelheiten.
Antwort2
#!/bin/bash
myfile=''
mydir=''
parse_args() {
case "$1" in
-d)
mydir="$2"
;;
-f)
myfile="$2"
;;
*)
echo "Unknown or badly placed parameter '$1'." 1>&2
exit 1
;;
esac
}
while [[ "$#" -ge 2 ]]; do
parse_args "$1" "$2"
shift; shift
done