Voici une interface d'arguments de commande simple et généralisée que vous pouvez coller en haut de tous vos scripts.
#!/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]}"
En exécutant la commande :
bashScript.sh firstArg -pf -myFlag "my flag value" secondArg -Ct: thirdArg -f
Le résultat sera le suivant :
"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
Fondamentalement, les arguments sont divisés en drapeaux booléens et en arguments génériques. En procédant ainsi, l'utilisateur peut placer les drapeaux et les booléens n'importe où, tant qu'il conserve les arguments génériques (s'il y en a) dans l'ordre spécifié.
Permettant à moi et maintenant à vous de ne plus jamais avoir affaire à l'analyse des arguments de bash !
Vous pouvez visualiser un script mis à jour. aquí
Cela a été extrêmement utile au cours de l'année dernière. Il peut maintenant simuler la portée en faisant précéder les variables d'un paramètre de portée.
Il suffit d'appeler le script comme suit
replace() (
source $FUTIL_REL_DIR/commandParser.sh -scope ${FUNCNAME[0]} "$@"
echo ${replaceFlags[f]}
echo ${replaceBooleans[b]}
)
Il ne semble pas que j'ai implémenté l'argument scope, je ne sais pas pourquoi, je suppose que je n'en ai pas encore eu besoin.