Hier ist eine verallgemeinerte einfache Befehlsargumentschnittstelle, die Sie oben in alle 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 lautet wie folgt:
"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, Boolesche Werte und generische Argumente unterteilt. Auf diese Weise kann ein Benutzer die Flags und Booleschen Werte an einer beliebigen Stelle platzieren, solange er die generischen Argumente (falls vorhanden) in der angegebenen Reihenfolge aufbewahrt.
Erlauben Sie mir und jetzt Ihnen, sich nie wieder mit dem Parsen von Bash-Argumenten zu befassen!
Sie können eine aktualisierte Skript sehen hier
Dies war im letzten Jahr enorm nützlich. Es kann jetzt den Bereich simulieren, indem den Variablen ein Bereichsparameter vorangestellt wird.
Nennen Sie einfach das Skript wie
replace() (
source $FUTIL_REL_DIR/commandParser.sh -scope ${FUNCNAME[0]} "$@"
echo ${replaceFlags[f]}
echo ${replaceBooleans[b]}
)
Sieht nicht so aus, als hätte ich den Argumentationsbereich implementiert. Ich bin mir nicht sicher, warum ich ihn wohl noch nicht gebraucht habe.