PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu getops



jbo83
06-03-2007, 12:51
Hallo Zusammen,

habe mittels Ksh und expect ein SKript geschrieben, welches remote Aktionen ausführt.

Nun wollte ich Zielhost und Befehl als Parameter -c und -h übergeben.


function usage {
USAGE=$"
[+NAME?${SCRIPT_NAME} - starts Action on Remote Server]
[+DESCRIPTION?Starts Action on Remote Server as root User]
[h:host?target hostname.]:[targethostname]
[c:cmd?Command.]:[targetcmd]
"

while getopts "${USAGE}" OPT
do
case ${OPT} in
h) rhost="${OPTARG}" ;;
c) CMD="$OPTARG" ;;
*) usage ;;
esac
done
shift $(($OPTIND - 1))

if [ -z "$rhost" ] -o [ -z "$CMD" ]; then
echo "Missing Options"
exit 1
fi

echo "$CMD"
echo $rhost
}



Das Funktioniert auch, solange kein - im Argument ist.
z.B. Skript -h loclahost -c date <- ist ok...
aber ein Skript -h localhost -c "ls -l" scheitert an getopts....

Hat einer eine Idee wie man das umgehen kann?

Vorteil an getopts ist die --man Funktion

jan61
11-05-2007, 23:17
Moin,

zuerst mal eine Frage zu Deinem Scriptschnipsel: Wenn ich das richtig sehe, dann ist der gesamte Block die Funktion usage? Dann hast Du da eine Rekursion drin, denn im case-Block wird im *-Zweig usage wieder aufgerufen.

Ich habe mal (allerdings mit bash) ein einfaches getopts ausprobiert - bei mir funktionierts:


#! /bin/bash
while getopts "h:c:" OPT; do
case $OPT in
h) rhost="$OPTARG";;
c) cmd="$OPTARG";;
*) echo "usage";;
esac
done
shift $(($OPTIND - 1))
echo "rhost: $rhost"
echo "cmd: $cmd"
test -n "$1" && echo "param: $1"
exit 0

Das liefert:


jan@jack:~/tmp> ./chk_getopts.sh -h ich -c "ls -l" blablubb
rhost: ich
cmd: ls -l
param: blablubb


Jan