Ich versuche, ein Shell-Skript zu erstellen, das so ausgeführt wird:
script.sh -t application
Zunächst möchte ich in meinem Skript prüfen, ob das Skript mit der Markierung -t ausgeführt wurde. Wenn das Flag beispielsweise wie folgt ausgeführt wurde, möchte ich einen Fehler:
script.sh
Zweitens, unter der Annahme, dass es ein -t-Flag gibt, möchte ich den Wert nehmen und in einer Variablen speichern, die ich in meinem Skript beispielsweise wie folgt verwenden kann:
FLAG="application"
Bis jetzt ist der einzige Fortschritt, den ich bei all dem machen konnte, der, dass $ @ alle Befehlszeilenargumente ergreift, aber ich weiß nicht, wie sich dies auf Flags bezieht oder ob dies überhaupt möglich ist.
Sie sollten dieses getopts Tutorial lesen.
Beispiel mit -a
switch, das 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) ist niemals sicher zu verwenden, es sei denn, Sie sind know 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 (Shell Builtin) oder ziehen Sie einfach die Positionsparameter durch.
Verwenden Sie $#
, um die Anzahl der Argumente zu ermitteln. Wenn diese Zahl ungleich 2 ist, stehen nicht genügend Argumente zur Verfügung:
if [ $# -ne 2 ]; then
usage;
fi
Prüfen Sie als Nächstes, ob $1
gleich -t
ist, 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
}
Hier ist eine verallgemeinerte einfache Befehlsargumentschnittstelle, die Sie oben in alle Skripts 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]}"
Führen Sie den Befehl aus:
bashScript.sh firstArg -pf -myFlag "my flag value" secondArg -Ct: thirdArg -f
Die Ausgabe wird folgende sein:
"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 Flags Booleans und generische Argumente unterteilt .. Durch diese Vorgehensweise kann ein Benutzer die Flags und Booleans beliebig platzieren, solange er/sie die generischen Argumente (falls vorhanden) in den angegebenen Werten hält Auftrag.
Erlaube mir und jetzt gehst du nie wieder mit bash arguemnt parsen!
Versuchen Sie shFlags - Erweiterte Befehlszeilenbibliothek für Unix-Shell-Skripts.
http://code.google.com/p/shflags/
Es ist sehr gut und sehr flexibel.
FLAGENTYPEN: Dies ist eine Liste der DEFINE _ * - Werte, die Sie ausführen können. Alle Flaggen nehmen einen Namen, einen Standardwert, eine Hilfefolge und einen optionalen Kurznamen (ein Buchstabe name). Einige Flags haben andere Argumente, die mit dem Flag beschrieben werden.
DEFINE_string: nimmt alle Eingaben und stellt sie als Zeichenfolge dar.
DEFINE_boolean: In der Regel ist kein Argument erforderlich: Sagen Sie --myflag, um .__ festzulegen. FLAGS_myflag auf true oder --nomyflag, um FLAGS_myflag auf false zu setzen . Alternativ können Sie sagen --myflag = true oder --myflag = t oder --myflag = 0 oder --myflag = false oder --myflag = f oder --myflag = 1 Das Übergeben einer Option hat den gleichen Effekt wie das einmalige Übergeben der Option.
DEFINE_float: Übernimmt eine Eingabe und stellt diese als Gleitkommazahl dar. Wie Shell unterstützt keine Floats an sich, die Eingabe wird lediglich als .__ validiert. ein gültiger Gleitkommawert sein.
DEFINE_integer: nimmt eine Eingabe und stellt sie als Ganzzahl dar.
SONDERFLAGGEN: Es gibt einige Flaggen, die eine besondere Bedeutung haben: --help (oder -?) druckt eine Liste aller Flaggen auf eine für Menschen lesbare Art und Weise --flagfile = foo liest Flags von foo. (noch nicht implementiert) - beendet wie in getopt () die Flag-Verarbeitung
BEISPIEL VERWENDUNG:
-- 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 übernommen