Bash script mit bestimmten Parametern aufrufen?

...komplette Frage anzeigen

6 Antworten

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

Antwort bewerten Vielen Dank für Deine Bewertung

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 bewerten Vielen Dank für Deine Bewertung

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 bewerten Vielen Dank für Deine Bewertung

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

Antwort bewerten Vielen Dank für Deine Bewertung

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

Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?