staging.inyokaproject.org

Script mit Optionen

Status: Ungelöst | Ubuntu-Version: Ubuntu 16.04 (Xenial Xerus)
Antworten |

Leubi

Avatar von 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
  • Option t da sollte nur der Wert aus einer Datei angezeigt werde.

  • Bei Option t wird das ausgegeben:

Datei auslesen und Wert anzeigen
Config file:
./neu1.sh: 38: ./neu1.sh: cannot create : Directory nonexistent
  • Ach und wenn ich irgendetwas eingebe wie zu Beispiel –g dann kommt nur Illegal option –g

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)
Avatar von Leubi

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)
Avatar von Leubi

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$NameSpeicher

Was 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 Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

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)
Avatar von Leubi

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 Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

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)
Avatar von Leubi

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)
Avatar von Leubi

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

Avatar von 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:

1
2
3
4
if [ $# = 0 ]; then
    echo "$usage1"
    exit 1
fi

LG,

track

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

track schrieb:

Du bräuchtest also nur zwischen Deiner Zeile 5 und 6 sowas einzufügen:

1
2
3
4
if [ $# = 0 ]; then
    echo "$usage1"
    exit 1
fi

Vielleicht kleinlich, aber $# ist ja eine Zahl, von daher eher:

1
2
3
4
if [ $# -eq 0 ]; then
    echo "$usage1"
    exit 1
fi

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

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)
Avatar von Leubi

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 Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

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)
Avatar von Leubi

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.

Antworten |