# Shell Skripten Tutorial



## js-mueller (4. November 2003)

Hi weiss jemand wo es gut verständliche  tutorials zum shell skripten gibt?
Ich wollt damit mal nen bissle anfangen.
Ich hoff jemand kennt nen paar.


----------



## Retlaw (4. November 2003)

Hallo,
hab mal paar grundlegende Dinge zusammengefasst:

Alles was auf der Konsole geht ist in Scripten verwendbar.
Script erstellen:
Erste Zeile:

```
#!/bin/ksh
```
(oder irgendeine andere Shell mit der das Script ausgeführt werden soll)
Als reine Textdatei speichern, z.B. mit vi, vim, emacs, ...
und das x-Recht setzen, damit es ausführbar ist.

Das Script kannst du dann wie ein Programm starten, es wird dann in einer neuen Shell ausgeführt.
Soll es in der aktuellen ausgeführt werden kannst du es mit  . scriptnamen starten.

Variablen:

```
# Kommentarzeile, wird nicht ausgeführt

$0           der Name des Script
$1 bis $9    Übergabeparameter an das Script
$#           Anzahl übergebener Parameter
$*           Liste aller übergebenen Parameter
$$           Prozessnummer des Script
$?           Exit-Code des letzten Prozess

# Länge einer Variablen
${#variable}

# Arrays:
# Eine Variable mit mehreren Feldern
var[0]="text"
var[1]="text"
...
# Werte aus einem Array anzeigen:
print ${var[1]}
# Alle Werte aus dem Array:
print ${var[*]}
# Anzahl gefüllter Werte im Array:
print ${#var[#]}

# Array automatisch erstellen lassen:
set -A Wochentage "Montag Dienstag Mittwoch ..."
# Wochentage[0] enthält jetzt Montag,
# Wochentage[1] enthält Dienstag, usw.
```

Funktionen:
Eine Funktion ist wie ein kleines Unterscript und bleibt
erhalten bis die Shell in der sie definiert wurde beendet wird.
Einer Funktion können Parameter übergeben werden die wieder über $1, $1, ... abgefragt werden können.

```
# Funktion erstellen:
meineFunktion()
{
  echo $1
}

# Aufruf der Funktion
meineFunktion "parameter"
```

Verzweigung:

```
if [[ -f $1 ]]
then "$1 existiert"
else "$1 existiert nicht"
fi
```

Schleifen:
als Ausdruck nach "in" kann eine Liste stehen. z.B. "eins zwei drei" oder das Ergebnis eines Kommandos oder Ausdrucks, z.B. `ls`
Im Schleifenkopf (beim for) muss die Variable ohne $-Zeichen stehen,
im Schleifenrumpf (do bis done) kann mit $ auf deren Inhalt zugegriffen werden.

```
echo "Dateien in ~/texte:"
for variable in `ls ~/texte`
 do
    echo $variable
done

# Alle Übergabeparameter anzeigen:
for param in $*
 do
    echo $param
done

# Wiederholen bis Bedingung wahr ist:
while [[ bedingung(en) ]]
 do
    # Anweisungen
done
```

"Ausführende" Hochkomma: `Ausdruck der ausgeführt werden soll`
Hochkomma für Texte: "Text"
Schützende Hochkomma: 'das $ Zeichen wird hier nicht durch eine Variable ersetzt'

Vergleiche:

```
[[ -n string ]]     wahr, wenn Stringlänge > 0
[[ -z string ]]     wahr, wenn String leer ist
[[ str1 != str2 ]]  wahr, wenn beide ungleich sind
[[ -f datei ]]      wahr, wenn datei eine normale Datei ist
[[ -d datei ]]      ...Verzeichnis
[[ -L datei ]]      ...symbolischer Link
[[ -s datei ]]      wahr, wenn datei größer 0
[[ -r datei ]]      wahr, wenn vom Prozess lesbar
[[ -w datei ]]      ... wenn beschreibbar
[[ -x datei ]]      ... ausführbar
[[ 1 -eq 2 ]]       wahr, wenn Ganzzahlen gleich sind
[[ 1 -ne 2 ]]       ... ungleich
... -gt  >
    -ge  >=
    -lt  <
    -le  <=
Negation einer Bedingung mit !
logisches UND:  bedingung1 -a bedingung2
logisches ODER: bedingung1 -o bedingung2
```

Verzweigung bei Vergleichen:

```
# entweder:
if [[ -n "Text" ]]
then # mach was
else # mach was anderes
fi
# oder
[[ -n "Text" ]] && anweisung || andere_anweisung
```

Der Variablen text das Ergebnis von ls zuweisen:

```
text=`ls`
```

Nützliche Hilfsprogramm für Scripte:
tr, grep, wc, cut, ...
formatierte Ausgabe mit printf
siehe man-pages

Script beenden mit exit, optional kann auch ein Exit-Code angegeben werden, exit 0 für fehlerfrei, exit 1 bzw. eine Ganzzahl für Fehlernummer.


----------



## Dario Linsky (4. November 2003)

Ein IMO sehr umfangreiches Tutorial zum Thema Shells und Scripting ist dieses: http://www.amazon.de/exec/obidos/AS...r=2-1/ref=sr_aps_prod_1_1/028-1014841-8706115

Ansonsten würd ich Dir aber eher Ruby empfehlen, das sieht meiner Meinung nach schicker aus als die typischen Shell-Sprachen, lässt sich aber auch ähnlich einsetzen.


----------



## js-mueller (5. November 2003)

danke für die super tipps, werd mich da gleich mal rein fuchsen


----------



## Habenix (6. November 2003)

ein sehr gutes Buch/Tutorial findest du hier 
Mit diesem feinem Dokument habe ich auch angefangen in die Bash zu tauchen



Ciao

Habenix


----------



## canuzzi (7. November 2003)

*shell*

versuchs mal mit

$man bash


----------

