Frage von jonsken, 46

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?

Antwort
von Linuxhase, 25

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

Expertenantwort
von guenterhalt, Community-Experte für Linux, 5

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 

Antwort
von flaglich, 22

Schau dir doch mal als beispiel die Skripte in  /etc/init.d an.

Antwort
von regex9, 25

Wie Funktionen in Bash definiert und aufgerufen werden, findest du hier:

http://openbook.rheinwerk-verlag.de/shell_programmierung/shell_008_000.htm#RxxKa...

Expertenantwort
von guenterhalt, Community-Experte für Linux, 18

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
Antwort
von barnim, 11

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

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten