|
Leubi
Anmeldungsdatum: 23. April 2017
Beiträge: 36
|
Moin, ich wollte mein Script erweitern und hänge fest. 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 | #!/bin/sh
#
usage1=" Bitte die Hilfe mit -h aufrufen"
usage=" Hilfe ..........."
readonly script_name="${0##*/}"
while getopts 'acht' option; do
case $option in
a) config_file="$(dirname $0)/test.conf";;
c) config_file=$OPTARG;;
h) echo $usage;;
t) echo " Datei auslesen und Wert anzeigen";;
\?) exit 1;;
*) echo $usage1;;
esac
done
shift $((OPTIND - 1))
if [ $# -gt 0 ]; then
echo "$script_name: $# unexpected argument(s): $*" 1>&2
echo $usage1
exit 1
fi
echo "Config file: $config_file"
. $config_file
echo $Variable1
echo $Variable2
echo $Variable2 > $PfadSpeicher$NameSpeicher
|
Wenn ich nur das Script test.sh aufrufe ohne Optionen dann sollte nur die Ausgabe von usage1 anzeigen werden. Option a funktioniert. Option c funktioniert leider nicht da sollte man eine andere Datei mit Pfad angeben können. Option h sollte nur ein Hilfetext anzeigen werden der bei usage steht. Bei Option h wird das ausgegeben :
Hilfe ...........
Config file:
./neu1.sh: 38: ./neu1.sh: cannot create : Directory nonexistent Datei auslesen und Wert anzeigen
Config file:
./neu1.sh: 38: ./neu1.sh: cannot create : Directory nonexistent
Da sollte auch usage1 mit ausgegeben werden. Wenn ich das richtig sehe wird das ganze Script abgearbeitet auch bei der Option h und t. Wäre nett wenn mir einer von Euch helfen könnte. lg Leubi Bearbeitet von sebix: Bitte verwende in Zukunft Codeblöcke, um die Übersicht im Forum zu verbessern! Bitte verwende in Zukunft Listen, um die Übersicht im Forum zu verbessern!
Bearbeitet von rklm: Syntaxhighlighting!
|
|
Leubi
(Themenstarter)
Anmeldungsdatum: 23. April 2017
Beiträge: 36
|
Moin, so das mit den Optionen h und t habe ich gelöst. #!/bin/sh
#
usage1=" Bitte die Hilfe mit -h aufrufen"
usage=" Hilfe ..........."
readonly script_name="${0##*/}"
while getopts 'acht' option; do
case $option in
a) config_file="$(dirname $0)/test.conf";;
c) config_file=$OPTARG;;
h)
hilfe=$usage
echo "$hilfe"
exit;;
t)
ZW=`head -n 1 testwert.txt`
I=$ZW I=$(( 90 - $I ))
echo " Der Wert lautet $I"
exit;;
\?) exit 1;;
*) echo $usage1;;
esac
done
shift $((OPTIND - 1))
if [ $# -gt 0 ]; then
echo "$script_name: $# unexpected argument(s): $*" 1>&2
echo $usage1
exit 1
fi
echo "Config file: $config_file"
. $config_file
echo $Variable1
echo $Variable2
echo $Variable2 > $PfadSpeicher$NameSpeicher
|
|
Leubi
(Themenstarter)
Anmeldungsdatum: 23. April 2017
Beiträge: 36
|
Moin,
so das Problem mit Option a und b müßte auch erledigt sein. #!/bin/sh
#
usage1=" Bitte die Hilfe mit -h aufrufen"
usage=" Hilfe ..........."
readonly script_name="${0##*/}"
while getopts ':t:c:ha' option; do
case $option in
a) config_file="$(dirname $0)/test1.conf";;
c) config_file=$OPTARG;;
h)
echo "$usage"
exit;;
t)
config_file=$OPTARG
. $config_file
ZW=`head -n 1 $ZD`
I=$ZW
I=$(( $WT - $I ))
echo " Der Wert lautet $I"
exit
;;
\?) exit 1;;
*)
echo "$usage1"
exit;;
esac
done
shift $((OPTIND - 1))
if [ $# -gt 0 ]; then
echo "$script_name: $# unexpected argument(s): $*" 1>&2
echo $usage1
exit 1
fi
echo "Config file: $config_file"
. $config_file
echo $Variable1
echo $Variable2
echo $Variable2 > $PfadSpeicher$NameSpeicherWas ich aber noch nicht hinbekommen habe ich das, wenn ich keine Option angebe das dann usage1 angezeigt wird. Und bei der Option t muss ich immer die confdatei jetzt angeben, kann man das ändern so wenn die confdatei im Verzeichnis ist das die genommen wird und wenn keine da ist das man dann den Pfad zur confdatei angeben muss? lg Leubi
|
|
Mokkujin
Anmeldungsdatum: 2. Mai 2008
Beiträge: 389
|
|
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4735
|
@Leubi Die API erscheint mir ein bisschen komisch. Optionen heissen so weil sie optional sind. Wenn man sich zwingend für mindestens eine Option entscheiden muss, dann ist das eigentlich ein Argument was man eben zwingend angeben muss und dazu nimmt man in aller Regel (positionale) Argumente. Die -a-Option macht aber auch nicht wirklich Sinn und ”verbraucht” unnötigerweise diesen Buchstaben für andere mögliche Optionen. Diese Option würde man einfach weg lassen und entweder $config_file vor der Auswertung der Optionen auf den entsprechenden Wert setzen, oder nach der Auswertung der Optionen auf den Wert setzen falls das nicht schon während der Auswertung der Optionen passiert ist. Dann hat man entweder einen Standarddateinamen für die Konfigurationsdatei wenn der Benutzer nichts anderes angibt, oder eben den Dateinamen den der Benutzer mit der -c-Option angibt.
|
|
Leubi
(Themenstarter)
Anmeldungsdatum: 23. April 2017
Beiträge: 36
|
He,
ok a lasse ich weg, das habe ich soweit verstanden. Aber wie kann ich das bei t lösen wenn ich die confdatei wo anders habe? Und wenn die confdatei nicht gefunden wird in dem Verzeichnis wo das Script ist könnte man da usage1 anzeigen lassen? lg Leubi
|
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4735
|
@Leubi: Die Option -t ist auch komisch und auch wenn ich Deine Frage nicht ganz verstehe, vermute ich einfach mal das Du hier den Fehler machst die Auswertung der Optionen mit Skriptfunktionalität zu vermischen. Du hast ja schon -c um einen Ort für die Konfigurationsdatei anzugeben, warum geht das mit -t auch/noch mal? Und natürlich kann man etwas ausgeben lassen wenn die angegebene oder im Skript hinterlegte Default-Konfigurationsdatei nicht existiert. if und der Test auf die Existenz einer Datei sind alles was man dazu braucht.
|
|
Leubi
(Themenstarter)
Anmeldungsdatum: 23. April 2017
Beiträge: 36
|
Ok mit t war unglücklich formuliert. Für t ziehe ich angaben aus der conf raus um einen Wert zu errechnen, der dann angezeigt wird. Und sollte die Confdatei nicht im gleichen Verzeichnis wie das Script seien, dann wollte ich das so haben "script -t /pfad/zur/confdatei.conf" damit t den Wert trotzdem errechnen kann. C war einfach nur dazu gedacht wenn die Confdatei einen anderen Namen bekommen hat, oder in einem anderem Verzeichnis ist. Wie muss die if abfrage denn aussehen?
|
|
Leubi
(Themenstarter)
Anmeldungsdatum: 23. April 2017
Beiträge: 36
|
Moin,
so ich habe das mit dem -t jetzt so gelöst das es -t und -T gibt. Ich glaube das ist besser so? lg Leubi
|
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
|
Leubi schrieb: ... Was ich aber noch nicht hinbekommen habe ich das, wenn ich keine Option angebe das dann usage1 angezeigt wird.
Das wird mit getopts auch wohl nicht gehen, aber für sowas hat die Shell Special Parameters. Du bräuchtest also nur zwischen Deiner Zeile 5 und 6 sowas einzufügen: | if [ $# = 0 ]; then
echo "$usage1"
exit 1
fi
|
LG, track
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13242
|
track schrieb:
Du bräuchtest also nur zwischen Deiner Zeile 5 und 6 sowas einzufügen: | if [ $# = 0 ]; then
echo "$usage1"
exit 1
fi
|
Vielleicht kleinlich, aber $# ist ja eine Zahl, von daher eher: | if [ $# -eq 0 ]; then
echo "$usage1"
exit 1
fi
|
|
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4735
|
Leubi schrieb: so ich habe das mit dem -t jetzt so gelöst das es -t und -T gibt. Ich glaube das ist besser so?
Ich glaube nicht. Ich weiss zwar nicht was es bedeutet, ahne es aber. Und dann wäre es nicht besser.
|
|
Leubi
(Themenstarter)
Anmeldungsdatum: 23. April 2017
Beiträge: 36
|
Hmm...
Marc_BlackJack_Rintsch Du machst mich fertig 😉 😬
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 | #!/bin/sh
#
USAGE1=" Bitte die Hilfe mit -h aufrufen"
USAGE=" Hilfe ....."
readonly script_name="${0##*/}"
config_file="$(dirname $0)/test2.conf"
while getopts 'T:c:th' option; do
case $option in
c) config_file=$OPTARG;;
h)
echo "$USAGE" | more
exit 1;;
t)
. $config_file
ZW=`head -n 1 $ZD`
I=$ZW
I=$(( $WT - $I ))
echo " Der Wert lautet $I"
exit
;;
T)
config_file=$OPTARG
. $config_file
ZW=`head -n 1 $ZD`
I=$ZW
I=$(( $WT - $I ))
echo " Der Wert lautet $I"
exit
;;
\?) exit 1;;
esac
done
shift $((OPTIND - 1))
if [ $# -gt 0 ]; then
echo "$script_name: $# unexpected argument(s): $*" 1>&2
echo $USAGE1
exit 1
fi
echo " lese Config file: $config_file ...."
|
So habe ich es gelöst, bestimmt sind da noch ein paar Fehler drinne, aber ich bin nicht perfekt 🙄
|
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4735
|
@Leubi: Das ist doch total unnötig, es gibt doch schon die -c-Option was -T überflüssig macht. Statt foo.sh -T something.conf kann man doch auch jetzt schon foo.sh -c something.conf -t schreiben. Dann brauchst Du auch den Code für -T/-t nicht zweimal in den Quelltext schreiben was redundant und fehleranfällig ist wenn man mal etwas daran ändern will/muss und das dann immer zweimal machen muss und beide Male gleich. Ich würde das was bei -t passieren soll auch erst nach der Auswertung der Optionen machen. Damit foo.sh -c something.conf -t und foo.sh -t -c something.conf nicht etwas unterschiedliches bedeutet. Das erwartet man nämlich nicht unbedingt, da das bei den meisten Programmen keinen Unterschied macht. Zwischen Auswertung der Optionen und ausführen von was auch immer das Skript dann tun soll, kannst Du dann auch einmal den Code schreiben der testet ob die explizit oder implizit ausgewählte Konfigurationsdatei überhaupt existiert und entsprechend reagiert wenn sie nicht existiert. Und ”sourcen” wirst Du die Konfigurationsdatei ja wahrscheinlich auch unabhängig davon ob -t angegeben wurde oder nicht.
|
|
Leubi
(Themenstarter)
Anmeldungsdatum: 23. April 2017
Beiträge: 36
|
@Marc_BlackJack_Rintsch: Dann werde ich mich mal die Tage dransetzen und schauen ob ich das so hinbekomme wie Du das meinst. So wie Du das meinst war auch erst eine Idee die ich im Auge gefast hatte, aber das hatte ich nicht hinbekommen, daher das Doppelgemoppel im Script.
|