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
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
Please also mark the comments that contributed to the solution of the article
Content-Key: 360746
Url: https://administrator.de/contentid/360746
Printed on: April 25, 2024 at 08:04 o'clock
10 Comments
Latest comment
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
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
Hallo WinLiCLI,
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
Zitat von @WinLiCLI:
Ich würde gerne ein kleines Shellskript erstellen, wo ich eigene Optionen mit geben kann.
./meinshellskript -meineOption
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
Hallo Alchimedes,
Ob
Analog dazu gibt es in Batch die
Damit lässt sich die Aufgabenstellung doch erledigen,
oder was wären "richtige" Kommandozeilenoptionen?
meinshellskript
Aufruf
Ausgabe
Gruß Frank
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.
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.
beispiel:
./meinshellskript -meineOption
Daraufhin soll mein Skript mit der gewünschten Option starten.
meinshellskript
#!/bin/bash
echo "Meine Option: $1"
./meinshellskript -meineOption
Meine Option: -meineOption
Gruß Frank
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.
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
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.
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
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:
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
Welches erste Array und was wäre dann das zweite Array und von welcher Art Arrays sprechen wir hier?
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
(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
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
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
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.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 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
Hallo,
ganz genau.
Jo, sind wir.
Hier ein Beispiel das es verdeutlicht:
Bei der Option c wird ein Argument verlangt
Gruss
Nachtrag:
Bin gerade in Scriptlaune:
Beispiel2
Hoffe es ist jetzt etwas verstaendlicher
Gruss
Ein Beispiel:
ls -l /var
ls ist der Befehl, -l ist eine Option und /var ist ein Argument.
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
Gruss
Hallo Alchimedes,
danke für Deine Beispiele.
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
Bei Linux ist es genauso, nur heißen die Variablen nicht
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.
Zusätzlich kann man bei Linux, bei der Auswertung zwischen Optionen, Argumenten (für eine Option) und sonstigen Parametern unterscheiden.
Das geht mit
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:
Wertet man die Parameter als reine Parameter aus, so sind diese Varianten nicht ergebnisgleich:
Man kann, falls man das für sinnvoll hält, auch beide Abfragearten ($1-9 und getopts) in einem Skript anwenden.
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.
(Die Verwendung von
Es gibt dann auch noch die langen Optionen, also die, die mit Doppelminus gekennzeichnet werden.
Diese können ebenfalls als einfache als Parameter
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
danke für Deine Beispiele.
Ich hab auch noch diese Artikel gelesen, um Deine Beispiele zu verstehen:
- http://openbook.rheinwerk-verlag.de/shell_programmierung/shell_005_007. ...
- https://spielwiese.la-evento.com/xelasblog/archives/28-Skriptoptionen-mi ...
- http://wiki.bash-hackers.org/howto/getopts_tutorial
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
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
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
Hallo Frank,
der TO ist wohl gefeuert wurden weil er den Job nicht erledigt hat !?
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
http://www.bashguru.com/
http://openbook.rheinwerk-verlag.de/unix_guru/
Gruss
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.
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 !?
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
http://www.bashguru.com/
http://openbook.rheinwerk-verlag.de/unix_guru/
Gruss