winlicli
Goto Top

Eigenes Shell Skript (Bash) mit eigenen Parametern erstellen

Hallo zusammen,

ich habe eine kleine Noob Frage.

Ich würde gerne ein kleines Shellskript erstellen, wo ich eigene Optionen mit geben kann.

beispiel:

./meinshellskript -meineOption

Daraufhin soll mein Skript mit der gewünschten Option starten.

Kann mir jemand verraten wie das Stichwort dazu ist bzw. wie ich das hinkriege?

Lg

Content-Key: 360746

Url: https://administrator.de/contentid/360746

Printed on: April 25, 2024 at 08:04 o'clock

Member: Alchimedes
Alchimedes Jan 11, 2018 at 23:55:18 (UTC)
Goto Top
Hallo,

zuerst stellt sich die Frage was fuer ein Script und was fuer Optionen sollen zur Auswahl stehen ?
getops wird genutzt um Kommandozeilenoptionen auszuwerten.

Hier aus dem Shellscript Buch von Juergen Wolf als Beispiel:

http://openbook.rheinwerk-verlag.de/shell_programmierung/shell_005_007. ...

Ansonsten natuerlich ueber die Read funktion und Schleifen aber das nur ins blaue geraten da keine Informationen vorhanden sind.

Gruss
Member: Kraemer
Kraemer Jan 12, 2018 at 07:09:33 (UTC)
Goto Top
Member: Pedant
Pedant Jan 12, 2018 at 10:13:33 (UTC)
Goto Top
Hallo WinLiCLI,

Zitat von @WinLiCLI:
Ich würde gerne ein kleines Shellskript erstellen, wo ich eigene Optionen mit geben kann.
./meinshellskript -meineOption

Diese Seite solltest Du lesen:
https://wiki.ubuntuusers.de/Shell/Bash-Skripting-Guide_für_Anfä ...
Sie wird Dir noch viele andere Fragen beantworten und Deine aktuelle Frage wird in diesem Abschnitt beantwortet:

Parameter an ein Skript übergeben
Ein Skript kann bei seinem Start Parameter übernehmen, indem diese, durch Leerzeichen oder Tabulator (engl.: "whitespaces") getrennt, bei seinem Aufruf übergeben werden. Die Parameter befinden sich zur Laufzeit des Skripts in den Variablen $1 bis $9 und können dazu genutzt werden, das Skript in seiner Arbeit zu beeinflussen.
(Die Seite enthält auch Beispiele.)

Gruß Frank
Member: Alchimedes
Alchimedes Jan 13, 2018 at 15:01:05 (UTC)
Goto Top
Hallo Pedant,

das was Du dort beschreibst sind arrays und nicht Kommandozeilenoptionen.
Wenn Du arrays fuer ein Script vorraussetzt muessen die auch eingehalten , genutzt werden ,das ist bei Kommandozeilenoptionen nicht der Fall.

Gruss
Member: Pedant
Pedant Jan 14, 2018 updated at 15:46:02 (UTC)
Goto Top
Hallo Alchimedes,

Zitat von @Alchimedes:
das was Du dort beschreibst sind arrays und nicht Kommandozeilenoptionen.
Wenn Du arrays fuer ein Script vorraussetzt muessen die auch eingehalten , genutzt werden ,das ist bei Kommandozeilenoptionen nicht der Fall.

Ob $1 bis $9 ein Array sind, ich glaube nicht, da der Aufruf nicht wie bei einem Array erfolgt: ${MeinArray[1]}

Analog dazu gibt es in Batch die %1 bis %9 und optional shift.
Damit lässt sich die Aufgabenstellung doch erledigen,
oder was wären "richtige" Kommandozeilenoptionen?

Zitat von @WinLiCLI:
beispiel:

./meinshellskript -meineOption

Daraufhin soll mein Skript mit der gewünschten Option starten.

meinshellskript
#!/bin/bash

echo "Meine Option: $1"  
Aufruf
./meinshellskript -meineOption
Ausgabe
Meine Option: -meineOption

Gruß Frank
Member: Alchimedes
Alchimedes Jan 16, 2018 at 01:21:14 (UTC)
Goto Top
Hallo,

das ist falsch, da Du mit $1 nichts anderes aufrufst als das erste Array.
Dazu musst Du wissen das ein Array nichts als ein Platzhalter fuer ein Argument ist, b.z.w fuer selbst gesetzte Variable sein kann.

Die Parameter befinden sich zur Laufzeit des Skripts in den Variablen $1 bis $9 und können dazu genutzt werden, das Skript in seiner Arbeit zu
beeinflussen.

Du rufst mit -meineOption auch keine Option auf, den wenn der Aufruf nur ./meinshellscript ist
wird echo $? immer 0 ergeben. Es sei denn es ist eine Bedingung ein Argument beim Aufruf zu uebergeben.
Dann ist der exit code ($?)immer 1 ohne Argument !
Somit unterscheidet sich Optionen definitiv von eigenen Parametern.

Den Optionen sind und bleiben Optionen, siehe z.B das Kommando ls, geht auch ohne Optionen.
Und das Kommando shift macht nichts anderes als die Positionen des Arrays zu veraendern.

Gruss
Member: Pedant
Pedant Jan 16, 2018 at 12:12:38 (UTC)
Goto Top
Hallo Alchimedes,


zuerst das Wichtigste

Können wir davon ausgehen, dass die Aufgabe im Sinne der Fragestellung mit meinen Codebeispiel gelöst ist und wir im Folgenden lediglich über Begriffsdefinitionen diskutieren
oder
ist am meinen simplen Codebeispiel etwas falsch und sollte von WinLiCLI daher nicht verwendet werden?


Option oder Argument

Ich versteh Dich so, dass Du die These vertritts, dass eine Option nur dann eine ist, wenn sie den Ablauf des Programms/Skriptes steuert und wenn sie das nicht tut, dann ist sie lediglich ein Argument.
Es geht also nicht um die Unterscheidung wie Optionen und Argumente übergeben werden, sondern welche Art der Auswirkung sie haben.

Ein Beispiel:
ls -l /var
ls ist der Befehl, -l ist eine Option und /var ist ein Argument.

Falls das so von Dir gemeint war, wäre ich d'accord.
Falls ich Dich falsch verstanden haben sollte oder mehr dahinter steckt, dann müsstest Du es weitergehend erklären.


Variable oder Array

Zitat von @Alchimedes:
das ist falsch, da Du mit $1 nichts anderes aufrufst als das erste Array.
Welches erste Array und was wäre dann das zweite Array und von welcher Art Arrays sprechen wir hier?

Zitat von @Alchimedes:
Dazu musst Du wissen das ein Array nichts als ein Platzhalter fuer ein Argument ist, b.z.w fuer selbst gesetzte Variable sein kann.
Ein Array ist mehr als ein Platzhalter für ein Argument. Es ist (potentiell) mindestens ein Regal und nicht nur eine Schachtel.
Ein Platzhalter für ein Argument wäre zunächst nur eine Variable mit Inhalt.
Wenn Du das schon als Array bezeichnest, dann wäre es ein null-dimensionales Array oder ein eindimensionales mit der Länge 1.

Es kann gut sein, dass die Gesamtheit aller Kommandozeilenparameter vom Kommdondinterperter als Array behandelt wird, aber dem Benutzer werden sie in vorbelegten, durchnummerierten Einzelvariablen präsentiert, die 1 bis 9, resprektive $1 bis $9 heißen.
(Anm.: $ ist nicht Teil des Namens, sondern Teil der Syntax.)

Der Zugriff auf ein Array würde formal über einen Index oder möglicherweise über einen Schlüsselnamen erfolgen, beispielsweise ${MeinArray[1]}, was formal bei den Variablen $1 bis $9 nicht der Fall ist.

Ich vertrete weiterhin die These, dass es sich hier um neun einzelne Variablen handelt und nicht um ein Array, ungeachtet dessen, dass deren Inhalt möglicherweise aus einem Array zur Verfügung gestellt wird. Man erhält aber keinen direkten Zugriff auf dieses Array, sondern lediglich auf diese vorbelegten Variablen.

Ich bin was Linux angeht als Anfänger einzustufen, aber der Unterschied zwischen einem Array und einer einfachen Variablen ist mir geläufig.


Abschließend

Wenn es lediglich um Begriffsklärung geht, dann lass uns das möglichst schnell und unkompliziert abschließen.
Sollte es um mehr gehen, also um mögliche Fehlerquellen bei der Nutzung oder gar um einen falschen Lösungsansatz meinerseits, dann müsste das noch aufgeklärt werden.

Gruß Frank
Member: Alchimedes
Solution Alchimedes Jan 16, 2018 updated at 18:56:30 (UTC)
Goto Top
Hallo,

Ein Beispiel:
ls -l /var
ls ist der Befehl, -l ist eine Option und /var ist ein Argument.

ganz genau.

Falls das so von Dir gemeint war, wäre ich d'accord.

Jo, sind wir.

Hier ein Beispiel das es verdeutlicht:

# Demonstiert Optionsauswahl
  
while getopts abc: opt
do
        case $opt in
                a) echo "Option a";;  
                b) echo "Option b";;  
                c) echo "Option c : ($OPTARG)";;  
        esac
done

Bei der Option c wird ein Argument verlangt

Gruss
Nachtrag:
Bin gerade in Scriptlaune:

# Beispiel mit Argumente
# Hier kann nicht auf das array zugegriffen werden!
echo "Bitte geben Sie Ihren Vornamen ein: "  
read vorname
echo "Bitte geben Sie Ihren Nachnamen ein: "  
read nachname

echo "Ihr Name lautet $vorname $nachname"  

Beispiel2
# Beispiel mit Argumente
  
# Hier kann:

echo "Bitte geben Sie Vorname und Nachname als Argument ein"  
echo "Beispiel: ./argument Alter Falter"  
echo "Vorname  : $1"  
echo "Nachname : $2"  

Hoffe es ist jetzt etwas verstaendlicher face-smile

Gruss
Member: Pedant
Solution Pedant Jan 17, 2018 at 11:12:32 (UTC)
Goto Top
Hallo Alchimedes,

danke für Deine Beispiele.

Zitat von @Alchimedes:
Hoffe es ist jetzt etwas verstaendlicher

Ich hab auch noch diese Artikel gelesen, um Deine Beispiele zu verstehen:

Jetzt habe ich es (weitgehend) verstanden und es geht also nicht nur um "Wortklauberei", sondern um einen echten Unterschied.


Das Folgende steht nicht im Widerspruch zu dem von Dir Geschriebenen, sondern zeigt meine Erkenntnisse auf, die ich daraus gezogen habe.

Bei Windows ist es egal, wenn man einem Befehl einen Wert mitgibt, ob man den dann Parameter, Option, Argument oder sonstwie nennt.
Die weitere Behandlung ist immer gleich.

In einer Windows-Batchdatei werden übergebene Parameter mit den Variablen %1 bis %9 abgefragt (shift für weitere) und man erhält damit den Wert des entsprechenden Parameters. Die Reihenfolge der Parameter ist dabei relevant.
%1 steht für den 1. Parameter von links, %2 für den 2. Parameter von links usw.

Bei Linux ist es genauso, nur heißen die Variablen nicht %1 bis %9, sondern $1 bis $9.
Die weitere Behandlung ist ansonsten gleich wie bei Windows.
Auch hier wird kein Unterschied zwischen Parameter, Option und Argumenten gemacht.
Es sind alles nur Parameter, die anhand ihrer Position abgefragt werden können.
$1 steht für den 1. Parameter von links, $2 für den 2. Parameter von links usw.

Zusätzlich kann man bei Linux, bei der Auswertung zwischen Optionen, Argumenten (für eine Option) und sonstigen Parametern unterscheiden.

Das geht mit getopts, wie in Deinem ersten Beispiel.
Eine Option ist immer ein einzelnes Zeichen (üblicherweise: a-z,A-Z, 0-9).
Eine Option wird immer mit einem führenden Minuszeichen gekennzeichnet, wobei Optionen auch gruppiert werden können.
Bei Optionen ist die Reihenfolge egal.

Wertet man die Parameter ausschließlich als Optionen aus, dann sind diese Varianten ergebnisgleich:
meinscript.su -a -b -c => Optionen a, b und c gesetzt
meinscript.su -c -b -a => Optionen a, b und c gesetzt
meinscript.su -abc     => Optionen a, b und c gesetzt
meinscript.su -cba     => Optionen a, b und c gesetzt

Wertet man die Parameter als reine Parameter aus, so sind diese Varianten nicht ergebnisgleich:
meinscript.su -a -b -c => $1=-a, $2=-b und $3=-c
meinscript.su -c -b -a => $1=-c, $2=-b und $3=-a
meinscript.su -abc     => $1=-abc, $2="" und $3=""
meinscript.su -cba     => $1=-cba, $2="" und $3=""

Man kann, falls man das für sinnvoll hält, auch beide Abfragearten ($1-9 und getopts) in einem Skript anwenden.
meinscript.su -a -b -c => Optionen a, b und c gesetzt UND $1=-a, $2=-b und $3=-c

Bei Parameter, die nicht Optionen sind (also ohne ein führendes Minus oder Teil einer Optionengruppe) übergeben wurden, kann man entscheiden, ob man sie als Argument für eine Option behandelt und/oder als einfachen Parameter.
meinscript.su -a Hallo => Option a gesetzt und Hallo als Argument für Option a gefunden UND $1=-a und $2=Hallo
(Die Verwendung von getopts mit oder ohne Doppelpunkt und $1-9 sind hier entscheidend bei der Auswertung.)

Es gibt dann auch noch die langen Optionen, also die, die mit Doppelminus gekennzeichnet werden.
meinscript.su --eineOption
Diese können ebenfalls als einfache als Parameter S1-9 abgefragt werden, können aber auch als Optionen behandelt werden.
Aufzuzeigen wie das geht, würde eine weitere Recherche erfordern.

Ich denke die Ausgangsfrage ist jetzt hinreichend beantwortet, zumal der Fragesteller ohnehin wieder nur einer diese Frage-stell-Bots war, der eine Frage generiert und dann verschwindet oder er ist ein echter Gentleman, genießt und schweigt.

Gruß Frank
Member: Alchimedes
Alchimedes Jan 17, 2018 at 15:05:43 (UTC)
Goto Top
Hallo Frank,

Ich denke die Ausgangsfrage ist jetzt hinreichend beantwortet, zumal der Fragesteller ohnehin wieder nur einer diese Frage-stell-Bots war, der eine
Frage generiert und dann verschwindet oder er ist ein echter Gentleman, genießt und schweigt.

der TO ist wohl gefeuert wurden weil er den Job nicht erledigt hat !? face-smile
Windows und batch.. bleib mir weg damit.

Aber die Bashhackerwiki kannte ich nicht, hab ich gleich als Lesezeichen gespeichert.
Denke das war insgesamt ein spannender Thread.
Und mit dem Wissen glist Du dann bestimmt nicht mehr als Linuxanfaenger sondern schon auf dem Weg zum Bashguru face-smile

http://www.bashguru.com/
http://openbook.rheinwerk-verlag.de/unix_guru/

Gruss