Shell

 

Shell

= Schnittstelle vom Betriebssystem zum Anwender.

Aufgaben:
- Kommandointerpreter ( unter Windows: command.com)
- Programmierung (z.B. Sicherungsabläufe, Konfigurationen, Steuerung der Hardware)

Shell Programme:
- bash
- sh
- ash
- ksh
- csh
(diese Varianten sind von der Konsole aus über Eingabe der Namen aufrufbar)

Bash Befehle:
- $0 = Anzeige der Variante
- echo $BASH_VERSION (Versionsangabe)
- $ = eine Variable. Alle Variablen in "Großbuchstaben" sind zu
  99% Systemvariablen

- echo = Ausgabe z.B. echo hallo -> hallo
- Befehlswiederholungen: Pfeil rauf und runter
- Einsatz von zusätzlichen Zeichen Pfeil rechts und links
- Zeichen löschen: entf Taste; Rückgabetaste
- Alt+d = Zeichenkette, Wort löschen
- Strg+k = ab Schreibmarke Zeile löschen
- Expansion z.B. f und 2 mal Tab = Auflistung aller Befehle, die mit f anfangen
- Strg+l = Bildschirminhalt löschen (clear)
- Strg+r = Befehl suchen (reverse-i-search) dann Eingabe des Befehls ->
  eingesetzter Befehl wird angezeigt (ist während der gesamten Sitzung im Speicher)

- find = suchen von Texten, Dateien, Berechtigungen und zeitgesteuerte Infos

find (Suche nach Datei- oder Verzeichnisinhalten)

BSP 1:
find / -name *.conf (Auflistung aller Konfigurations Dateien im System)

BSP 2:
find / -name *.conf | grep etc (Auflistung aller Konfigurations Dateien im Verzeichnis
etc aber auch in einer Zeichenkette z.B.
/usr/share/doc/packages/fetchmail/contrib/gotmail.conf)

- | = Pipe Verketten 2-er Befehle, wobei eine Ausgabe erzeugt werden muss; Befehl1 | Befehl2

grep (suche nach Dateien)

grep /etc/squid.donf http

Alias (Kurzform für Befehl)
Aliasname =`kommando` (hier können Befehle selbst definiert werden;
z.B.bei häufigen und auch langen Befehlen)

alias xxl=`find / -name *.conf | grep etc` dann Eingabe des Befehls (hier xxl)

Kommandosubstitution

Auf 2 Konsole zB YAST aufrufen, mit ps sich die PID anzeigen lassen
(hier 1844)

a=1844 (Variable zuweisen)

echo $a > psid

cat psid
ps cat `cat psid`

es erfolgt folgende Anzeige (liest Inhalt der PSID raus und sucht
nach dem Wert 1844)

PID        TTY       STAT       TIME       COMMAND
1844       tty1          S       00:01        yast

kill `cat psid` (Prozess wird gestoppt)

Programm erstellen
über Konsole kedit öffnen;
a=7
echo $a

unter /root/prg1 speichern

Über Konsole mit ll Inhalt auflisten und die Rechte an der Datei
ändern (chmod 744 prg1)
Eingabe: ./prg1
Es erscheint die Ausgabe 7

Editor: kedit
Variablen:
Man unterscheidet:
- numerische Variablen
- alphabetische Variablen
- lokale Variablen = nur för das Programm geltend
- globale Variablen = gelten während der gesammten Arbeitssitzung

Set = Anzeige von globalen Variablen
echo $PATH = (Auflistung der Pfadbeschreibung; ersichtlich an :)

Definition einer lokalen Variablen:(declare)

declare a=7

Definition einer globalen Variablen: (export)

export a=7

Beispielprogramm


# Variablen
echo Übergabeparameter: $* (hier können z.B. schon Befehle mit eingegeben werden)
echo user ist: $user (aktueller Benutzer)
echo shell ist: $SHELL (aktuelle Shell)
echo Parameter 1 ist: $1 (ist Systemvariablen)
echo Prozedurname ist: $0 (Ausgabe des Dateinamens)
echo Prozessnummer ist: $$ (Ausgabe der Prozessnummer)
echo Anzahl der Parameter ist: $# (Ausgabe der Anzahl der Parameter)
a=17.89        # ohne Lücken am = Zeichen (Ausgabe der Zahl mit . da engl. Schreibweise)
echo a ist $a

Speichern unter /root/einfach

Datei über Konsole aufrufen chmod 744 einfach (zum ändern der Rechte eingeben)

Datei aufrufen:
./einfach

es kommt folgende Ausgabe:
UÜbergabeparameter:
user ist:
shell ist: /bin/bash
Parameter 1 ist:
Prozedurname ist: ./einfach
Prozessnummer ist: 2038
Anzahl der Parameter ist: 0
a ist 17.89

Datei aufrufen:

./einfach abc 123 xyz

UÜbergabeparameter: abc 123 xyz
user ist:
shell ist: /bin/bash
Parameter 1 ist: abc
Prozedurname ist: ./einfach
Prozessnummer ist: 2039
Anzahl der Parameter ist: 3
a ist 17.89



Kommentar
Wird mit # und Text ausgewiesen. Der Kommentar ist sinnvoll, damit eine
kurze Beschreibung des Programms ersichtlich wird.

#! /bin/sh       Ist Kommentar für Shell


 

Verzweigungen if/then/else



if Bedingung; then
         Kommandos
         Kommandos
             ...
[elif Bedingung; then
         Kommandos] {Sind manchmal notwendig aber träger, Kombination zw Else und IF}
[else] [Kommando] (Optional)
fi

Bedingung:
immer in [   ] setzen und mit Leerzeichen vor Zeichenkette;
Zeichenkette immer in " "
wahr oder unwahr= [ Zeichenkette1 = Zeichenkette2 ] oder [ Zeichenkette1 != Zeichenkette2 ]

alphabetische Bedingungen:

= Gleichheit
!= Ungleichheit

numerische Bedinungen:

-lt        > (lower then; größer als)
-gt        < (greater then; kleiner als)
-le    <= (lower equal; kleiner/gleich)
-ge        >= (greater equal; größer/gleich)
-eq        = (equal; gleich)
-ne        != (not equal; nicht gleich)

und/oder:

[[ Bedingung1 ] -a [ Bedingung2 ]]   {a=and}

[[ Bedingung1 ] -o [ Bedingung2 ]]   {o=or}

Beispiel:

#! /bin/sh
# Interaktive Eingabe, if-Abfrage
echo Hallo, user, alles in Ordnung?
echo Ihre Antwort, n/j:
read answer {lesen von Variable;nicht mehr als 16 Zeichen haben, dt. Namen; keine Umlaute}
echo Ihre Antwort war $answer
# if ["$answer" = "j" ]
if [ "$answer" != "n" ]
then echo ja
else echo nein
fi

 

Mehrfach Verzweigungen CASE



case       Variable         in
muster1) Kommandos;;
muster2) Kommandos;;{doppelte; zum Beenden der Befehlszeile,
einfach ; Auflistung mehrerer Befehle}

esac


Beispiel
#! /bin/sh
# Interaktive Eingabe, Mehrfachunterscheidung (case)
echo Alles in Ordnung?
echo Ihre Antwort:
read answer
echo Ihre Antwort war: $answer
case $answer in
j* | J* | y* | Y*) echo jawohl;;
n* | N+) echo nein, ueberhaupt nicht!;;
*) echo das war wohl nichts;;
esac

 

Schleifen (Kontrollstruktur innerhalb eines Programms,
die Anweisungen wiederholen


while oder until Bedingung; do
       Kommandos

done

Beispiel

i=1
while [ "$i" -le 5 ]
do
echo $i
i=$[$i+1]
done

weitere Schleife

for
var in liste
do
kommando
kommando
...
done

Beispiel
#for Schleife
x=a
for $x in a b c; do
echo $x
done

Kombination

i=1
while [ "$i" -le 5 ]
do
echo Alles in Ordnung?
echo Ihre Antwort:
read answer
echo Ihre Antwort war: $answer
case $answer in
j* | J* | y* | Y*) echo jawohl;;
n* | N+) echo nein, ueberhaupt nicht!;;
*) echo das war wohl nichts;;
esac
i=$[$1+1]
done

weiteres Beispiel: Kombination
while [ "$antwort" != "x" ]; do
echo "                   Menueauswahl"
echo "                   1 -> Inhaltsverzeichnis"
echo "                   2 -> Benutzerübersicht"
echo "                   3 -> Pfadanzeige"
echo "                   x -> Beenden"
read antwort
case $antwort in
1) ls -l; sleep 3;;
2) who; sleep 3;;
3) pwd; sleep 3;;
esac
done


      

[Home] [HTML/CSS/XML] [Java Script] [Mail Konfig] [Unix Systeme] [Mandrak Redhead] [Suse 7.0] [Suse 7.3] [FTP Server] [Proxy Server] [Samba Server] [smb_conf] [Shell] [swat] [MS Systeme] [Gästebuch] [Forum] [Spiele] [Info] [Impressum]