W tym poście, chciałbym poruszyć odwieczny temat argumentów przekazywanych do skryptów. Każdy admin w swojej karierze “popełnia” parę skryptów ułatwiających mu pracę. Niektóre z nich zaczynają żyć własnym życiem i rozpowszechniane są wśród innych adminów…
I tu pojawia się temat… Fajnie by było, aby ich używanie nie odbiegało od standardu w świecie Linux-a.
Mam na mysli notacje:
./nazwa_skryptu -o opcja1 -p opcja2 … argument
Z zasady nie jestem zwolennikiem robienia “doktoratu” w temacie który jest tylko poboczny …i dlatego aby dalej się nie rozpisywać przedstawiam przykład użycia wbudowanej w bash funkcji “getopt” oraz “getopts”
Zasadnicza różnica między tymi funkcjami to możliwość używania “białych znaków” w argumentach opcji w przypadku funkcji getopts..
A teraz przykład:
set — `getopt p:m:n: “$@”`
while [ $# -gt 0 ]
do
case “$1” in
-p)
PASS=$2; shift;;
-m)
MODE=$2; shift;;
-n)
NAME=$2; shift;;
–) shift; break;;
-*)
echo >&2 “Usage: $0 -p Password [-m all|packagename|grpname] [-n Name]”
exit 1;;
*) break ;;
esac
shift
done;
echo “PASS = $PASS MODE = $MODE NAME = $NAME”
linia getopt p:m:n: oznacza nic innego jak “możliwe są opcje -p -m -n i każda spodziewa się argumentu”.
Jeśli chcieli byśmy pozwolić na opcje bez argumentu np. -p wtedy wyglądała by nastepująco:
getopt pm:n:
Funkcja shift przesuwa argument wejściowy na następną pozycje
A teraz przykład użycia getopts
while getopts p:m:n: opt
do
case “$opt” in
p)
PASS=”$OPTARG”;;
m)
MODE=”$OPTARG”;;
n)
NAME=”$OPTARG”;;
\?) # unknown flag
echo >&2 “Usage: $0 -p Password [-m all|packagename|grpname] [-n Name]”
exit 1;;
esac;
done;
shift `expr $OPTIND – 1`
echo “PASS = $PASS MODE = $MODE NAME = $NAME”
Mam nadzieje, że te dwa “gotowce” przyśpieszą żmudną pracę pisania otoczki skryptu właściwego. Have fun !