Bash script mit bestimmten Parametern aufrufen?
Hi,
ich würde gerne ein Skript (bash) schreiben, das verschiedene Funktionen ausführt. Die Grundfunktion ist gleich, es ändert sich nicht viel. Ich habe mir das so vorgestellt, dass ich das Skript mit
meinscript -a
ausführe und es dann die bestimmte Funktion aufruft. Ist das möglich?
6 Antworten
ein kleines Beispiel in bash-Syntax hatte ich dir bereits aufgeschrieben.
Ich selbst benutze diese Shell aber nicht mehr für größere Programme. Lediglich in Start-Scripten benutze ich die Bash, weil andere Shells da u.U. noch nicht verfügbar sind.
An Stelle der Bash steht bei mir die tclsh. Auch das ist eine Shell, deren Syntax, so sehe ich das, leichter zu verstehen ist.
Im Gegensatz zur Bash muss man aber mehr schreiben. Andererseits ist der Code dann auch lesbar und verständlich.
Wer sich selbst Tools, auch mit hohem Komfort, zusammenbasteln will, der ist da gut aufgehoben. Für die tclsh gibt es auch noch eine Erweiterung und man kann gleich grafische Elemente für Eingaben, Abfragen, Anzeigen ... auf den Bildschirm "zaubern".
Auch hier ein kleines Beispiel ( ohne Grafik)
#!/bin/bash
# \
exec tclsh "$0" "$@"
puts [lindex $argv 0 ]
if { [lindex $argv 0 ] == "ls" } { puts [ eval exec ls [lindex $argv 1 ] ] }
if { [lindex $argv 0 ] == "pwd" } { puts [pwd] }puts
"das wurde eingegeben: $argv"
Dabei steht in argv alles das, was als Parameter eingegeben wurde,
lindex $argv <Index-Nummer> enthält das Element "Index-Nummer"
puts bedeutet soviel wie gib es auf den Bildschrim
Damit du flexibel bleibst, was die Anzahl der Uebergabeparameter angeht, kannst du diese einfach durchshiften.
Quick&Dirty Beispiel:
while [ "$#" -gt "1" ]
do
case $1 in
-i|--include)
if [[ "$#" -ge 2 && "$2" != -* ]] then
VAR=$2
shift 2 else echo -e "ERROR: missing argument for $1" exit 1 fi
;;
-f|--foo)
FOO="true"
shift 1
;;
-h|--help)
help
;;
*)
echo -e "ERROR: Unknown option $1"
exit 1
;;
esac
done
Kurz erklaert:
Du gehst alle(!) uebergebenen Parameter der Reihe nach durch (solange es (noch) welche gibt). Dabei kannst du auf beliebige Zeichenketten matchen (z.B. nicht nur -i, sondern eben auch --include).
Nach erfolgreicher Behandlung des Parameters wird er - bildlich gesprochen - nach links verschoben, so dass fuer $1 der naechste uebergebene Wert angenommen werden kann.
Es kann Parameter geben die eine weitere Eingabe erfordern (siehe oben --include) oder Parameter die keine weitere Eingabe erfordern (siehe --foo).
cheers | barnim
Hallo
Bash script mit bestimmten aprametern aufrufen?
Klar geht das, einfach die Übergebenen Parameter als Kriterium nehmen:
#!/bin/bash
# Name: startstop.sh
# Autor: linuxhase@linuxhase.de
# Abhängigkeiten: bash, echo
# Was es tut: Es wird eine 'Fallunterscheidung' gemacht.
# Aufruf: "startstop.sh PARAMETER"
##########################################################################
# Einfache Variante 'ohne Überprüfung' ob das abgefragte Programm eventuell
# bereits läuft.
# '$1' ist der erste Wert hinter dem Aufruf, der übergeben wird:
case $1 in
start)
echo "Konsole wird gestartet" # Wenn 'start' übergeben wurde
;;
stop)
echo "Konsole wird gestoppt" # Wenn 'stop' übergeben wurde
;;
status)
echo "Statusabfrage der Konsole" # Wenn 'status' übergeben wurde
;;
esac
##########################################################################
# Erweiterte Variante 'mit Überprüfung' ob das abgefragte Programm eventuell
# bereits läuft und ob kein Parameter übergeben wurde, mit Hinweis wie der
# Aufruf auszusehen hat. 'konsole' wird hier beispielhaft abgefragt:
case $1 in
start)
test -z $(pidof konsole) || echo "Das Programm 'Konsole' läuft bereits mit: $(pidof konsole)"
exit 1
echo "Wird gestartet" # Wenn 'start' übergeben wurde
;;
stop)
test -z $(pidof konsole) || echo "Es läuft keine 'Konsole' die zu stoppen wäre"
exit 1
echo "Wird gestoppt" # Wenn 'stop' übergeben wurde
;;
status)
test -z $(pidof konsole) || echo "Das Programm 'Konsole' läuft nicht"
exit 1
echo "Statusabfrage" # Wenn 'status' übergeben wurde
;;
*) # Auf leeren Parameter prüfen
echo "Bitte verwende folgende Syntax:"
echo "$0 start" && exit 1
esac
Startest Du das Script also so:
startstop.sh start
dann wird eine bestimmte Aktion, ein Kommando (oder mehrere) ausgeführt. Rufst Du das Script statt dessen so auf:
startstop.sh stop
dann wird eine andere Kette in Gang gesetzt. Die Anzahl der Möglichkeiten ist in diesem Sinne eigentlich unbegrenzt. Du kannst das ganze natürlich auch mit mehreren Parametern tun:
startstop.sh PAR1 PAR2
dann würde jeder übergebene Parameter eine eigene Kommandokette oder einen einzelnen Befehl ausführen.
Linuxhase
natürlich geht das.
Hier ein kleines Beispiel
#!/bin/bash
if ( test $1 == 'ls' ) then
ls $2
fi
if ( test $1 == 'pwd' ) then
pwd
fi
echo "das wurde eingegeben: $0 $1 $2 "
Der Aufruf
erfolgt dann so:
<Name-der-Datei> ls -a
oder
<Name-der-Datei> pwd
Wie Funktionen in Bash definiert und aufgerufen werden, findest du hier: