Parsowanie argumentów w skrypcie

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 !

This entry was posted in Oracle DBA Basic. Bookmark the permalink.

Leave a Reply