Probieren Sie shFlags aus -- Erweiterte Befehlszeilen-Flag-Bibliothek für Unix-Shell-Skripte.
http://code.google.com/p/shflags/
Es ist sehr gut und sehr flexibel.
FLAG TYPES:Dies ist eine Liste der DEFINE_*'s, die Sie machen können. Alle Flags haben einen Namen, einen Standardwert, eine Hilfezeichenfolge und einen optionalen „kurzen“ Namen (Ein-Buchstaben-Name). Einige Flags haben andere Argumente, die mit dem Flag beschrieben werden.
DEFINE_string:Nimmt jede Eingabe und interpretiert sie als String.
DEFINE_boolean:verwendet normalerweise kein Argument:Sagen Sie --myflag, um FLAGS_myflag auf true zu setzen, oder --nomyflag, um FLAGS_myflag auf false zu setzen. Alternativ können Sie --myflag=true oder --myflag=t oder --myflag=0 sagen oder --myflag=false oder --myflag=f oder --myflag=1Das Übergeben einer Option hat denselben Effekt wie das einmalige Übergeben der Option.
DEFINE_float:Nimmt eine Eingabe und interpretiert sie als Fließkommazahl. Asshell unterstützt per se keine Gleitkommazahlen, die Eingabe wird lediglich als gültiger Gleitkommawert validiert.
DEFINE_integer:Nimmt eine Eingabe und interpretiert sie als Integer.
SPEZIELLE FLAGS:Es gibt ein paar Flags, die eine besondere Bedeutung haben:--help (oder -?) gibt eine Liste aller Flags in menschenlesbarer Form aus --flagfile=foo liest Flags von foo. (noch nicht implementiert)-- beendet wie in getopt() die Flag-Verarbeitung
VERWENDUNGSBEISPIEL:
-- begin hello.sh --
! /bin/sh
. ./shflags
DEFINE_string name 'world' "somebody's name" n
FLAGS "[email protected]" || exit $?
eval set -- "${FLAGS_ARGV}"
echo "Hello, ${FLAGS_name}."
-- end hello.sh --
$ ./hello.sh -n Kate
Hello, Kate.
Hinweis:Ich habe diesen Text aus der shflags-Dokumentation entnommen
Hier ist eine verallgemeinerte einfache Schnittstelle für Befehlsargumente, die Sie oben in all Ihre Skripte einfügen können.
#!/bin/bash
declare -A flags
declare -A booleans
args=()
while [ "$1" ];
do
arg=$1
if [ "${1:0:1}" == "-" ]
then
shift
rev=$(echo "$arg" | rev)
if [ -z "$1" ] || [ "${1:0:1}" == "-" ] || [ "${rev:0:1}" == ":" ]
then
bool=$(echo ${arg:1} | sed s/://g)
booleans[$bool]=true
echo \"$bool\" is boolean
else
value=$1
flags[${arg:1}]=$value
shift
echo \"$arg\" is flag with value \"$value\"
fi
else
args+=("$arg")
shift
echo \"$arg\" is an arg
fi
done
echo -e "\n"
echo booleans: ${booleans[@]}
echo flags: ${flags[@]}
echo args: ${args[@]}
echo -e "\nBoolean types:\n\tPrecedes Flag(pf): ${booleans[pf]}\n\tFinal Arg(f): ${booleans[f]}\n\tColon Terminated(Ct): ${booleans[Ct]}\n\tNot Mentioned(nm): ${boolean[nm]}"
echo -e "\nFlag: myFlag => ${flags["myFlag"]}"
echo -e "\nArgs: one: ${args[0]}, two: ${args[1]}, three: ${args[2]}"
Durch Ausführen des Befehls:
bashScript.sh firstArg -pf -myFlag "my flag value" secondArg -Ct: thirdArg -f
Die Ausgabe sieht so aus:
"firstArg" is an arg
"pf" is boolean
"-myFlag" is flag with value "my flag value"
"secondArg" is an arg
"Ct" is boolean
"thirdArg" is an arg
"f" is boolean
booleans: true true true
flags: my flag value
args: firstArg secondArg thirdArg
Boolean types:
Precedes Flag(pf): true
Final Arg(f): true
Colon Terminated(Ct): true
Not Mentioned(nm):
Flag: myFlag => my flag value
Args: one => firstArg, two => secondArg, three => thirdArg
Grundsätzlich sind die Argumente in boolesche Flags und generische Argumente unterteilt. Auf diese Weise kann ein Benutzer die Flags und booleschen Werte überall platzieren, solange er/sie die generischen Argumente (falls vorhanden) in der angegebenen Reihenfolge hält.
Erlaubt mir und jetzt Ihnen, sich nie wieder mit dem Analysieren von Bash-Argumenten auseinanderzusetzen!
Hier können Sie ein aktualisiertes Skript anzeigen
Dies war im letzten Jahr enorm nützlich. Es kann jetzt den Geltungsbereich simulieren, indem den Variablen ein Geltungsbereichsparameter vorangestellt wird.
Rufen Sie das Skript einfach auf wie
replace() (
source $FUTIL_REL_DIR/commandParser.sh -scope ${FUNCNAME[0]} "[email protected]"
echo ${replaceFlags[f]}
echo ${replaceBooleans[b]}
)
Sieht nicht so aus, als hätte ich den Argumentbereich implementiert, ich bin mir nicht sicher, warum ich ihn noch nicht benötigt habe.
Verwenden Sie $#
um die Anzahl der Argumente zu erfassen, wenn sie ungleich 2 ist, werden nicht genügend Argumente bereitgestellt:
if [ $# -ne 2 ]; then
usage;
fi
Überprüfen Sie als Nächstes, ob $1
entspricht -t
, ansonsten wurde ein unbekanntes Flag verwendet:
if [ "$1" != "-t" ]; then
usage;
fi
Speichern Sie schließlich $2
in FLAG
:
FLAG=$2
Hinweis:usage()
ist eine Funktion, die die Syntax zeigt. Zum Beispiel:
function usage {
cat << EOF
Usage: script.sh -t <application>
Performs some activity
EOF
exit 1
}
Sie sollten dieses Getopts-Tutorial lesen.
Beispiel mit -a
Schalter, der ein Argument erfordert:
#!/bin/bash
while getopts ":a:" opt; do
case $opt in
a)
echo "-a was triggered, Parameter: $OPTARG" >&2
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
Wie Greybot sagte (getopt
!=getopts
) :
Der externe Befehl getopt(1) kann niemals sicher verwendet werden, es sei denn, Sie wissen es ist GNU getopt, Sie nennen es GNU-spezifisch, und Sie stellen sicher, dass sich GETOPT_COMPATIBLE nicht in der Umgebung befindet. Verwenden Sie stattdessen getopts (shellbuiltin) oder durchlaufen Sie einfach die Positionsparameter.