Vyzkoušejte shFlags -- Pokročilá knihovna příznaků příkazového řádku pro unixové shellové skripty.
http://code.google.com/p/shflags/
Je velmi dobrá a velmi flexibilní.
TYPY VLAJEK:Toto je seznam DEFINE_*, které můžete udělat. Všechny příznaky berou název, výchozí hodnotu, řetězec nápovědy a volitelný 'krátký' název (jedním písmenem). Některé příznaky mají jiné argumenty, které jsou popsány příznakem.
DEFINE_string:vezme jakýkoli vstup a interpretuje jej jako řetězec.
DEFINE_boolean:obvykle nebere žádný argument:řekněte --myflag pro nastaveníFLAGS_myflag na true nebo --nomyflag pro nastavení FLAGS_myflag na false. Alternativně můžete říci --myflag=true nebo --myflag=t nebo --myflag=0 or--myflag=false nebo --myflag=f nebo --myflag=1Předání možnosti má stejný účinek jako jednorázové předání možnosti.
DEFINE_float:vezme vstup a interpretuje jej jako číslo s plovoucí desetinnou čárkou. Asshell nepodporuje floats per-se, vstup je pouze ověřen jako platná hodnota s plovoucí desetinnou čárkou.
DEFINE_integer:vezme vstup a interpretuje jej jako celé číslo.
SPECIÁLNÍ VLAJKY:Existuje několik příznaků, které mají zvláštní význam:--help (nebo -?) vytiskne seznam všech příznaků způsobem čitelným pro člověka --flagfile=foo přečtené příznaky z foo. (zatím neimplementováno) -- stejně jako v getopt(), ukončí zpracování příznaků
PŘÍKLAD POUŽITÍ:
-- 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.
Poznámka:Tento text jsem převzal z dokumentace shflags
Zde je zobecněné rozhraní s jednoduchými příkazy, které můžete vložit na začátek všech svých skriptů.
#!/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]}"
Spuštěním příkazu:
bashScript.sh firstArg -pf -myFlag "my flag value" secondArg -Ct: thirdArg -f
Výstup bude tento:
"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
Argumenty jsou v zásadě rozděleny na příznakové booleany a obecné argumenty. Tímto způsobem může uživatel umístit příznaky a booleovské argumenty kamkoli, pokud zachová obecné argumenty (pokud nějaké existují) v určeném pořadí.
Umožňujeme vám a mně, abychom se již nikdy nezabývali analýzou bash argumentů!
Aktualizovaný skript si můžete prohlédnout zde
To bylo za poslední rok nesmírně užitečné. Nyní může simulovat rozsah pomocí předpony proměnným parametrem rozsahu.
Stačí skript zavolat jako
replace() (
source $FUTIL_REL_DIR/commandParser.sh -scope ${FUNCNAME[0]} "[email protected]"
echo ${replaceFlags[f]}
echo ${replaceBooleans[b]}
)
Nevypadá to, že jsem implementoval rozsah argumentů, nejsem si jistý, proč jsem to asi ještě nepotřeboval.
Použijte $#
pro získání počtu argumentů, pokud se nerovná 2, není poskytnut dostatek argumentů:
if [ $# -ne 2 ]; then
usage;
fi
Dále zkontrolujte, zda $1
rovná se -t
, jinak byl použit neznámý příznak:
if [ "$1" != "-t" ]; then
usage;
fi
Nakonec uložte $2
v FLAG
:
FLAG=$2
Poznámka:usage()
je nějaká funkce ukazující syntaxi. Například:
function usage {
cat << EOF
Usage: script.sh -t <application>
Performs some activity
EOF
exit 1
}
Měli byste si přečíst tento tutoriál getopts.
Příklad s -a
přepínač, který vyžaduje argument :
#!/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
Jak řekl greybot (getopt
!=getopts
):
Použití externího příkazu getopt(1) není nikdy bezpečné, pokud víte je to GNU getopt, nazýváte jej způsobem specifickým pro GNU, a zajistíte, že GETOPT_COMPATIBLE není v prostředí. Místo toho použijte getopts (shellbuiltin) nebo jednoduše smyčkujte poziční parametry.