Kurzreferenz Linux Shell
Shell allgemein
Der Editor Vi/Vim
Beginnen wir mit dem Editor. Ohne einen Editor gibt es auch kein Scripting. Der Vi ist ein Editor für die Konsole. Der VIM (Vi IMproved) ist dabei eine spätere erweiterte Version des ursprünglichen VI. Ist VIM installiert, wird der ursprüngliche VI überlagert.

Im Eingabemodus:
| i (Insert) | Einfügen vor der aktuellen Position |
| I | Einfügen am Zeilenanfang |
| a(append) | Einfügen nach der aktuellen Position |
| A | Einfügen am Zeilenende |
| R | Wechsel in den Überschreibmodus ab aktueller Position |
| ESC | Wechsel in den Befehlsmodus |
Dateibehandlung (nur im Befehlsmodus, vorher ESC drücken)
| :w (write) | Speichern |
| :q | Verlassen des Editors ohne zu speichern. |
| :q! | Verlassen des Editors ausdrücklich ohne speichern. |
| :set nu | Zeilennummerierung einschalten. |
| :set nonu | Zeilennummerierung ausschalten. |
| :w Datei | Aktuellen Inhalt in Datei schreiben. |
Blättern und positionieren des Cursors
| CTRL-f | Vorwärtsblättern |
| CTRL-f | Rückwärtsblättern |
Weitere Befehle
| dd | Aktuelle Zeile löschen |
| ndd | Lösche n Zeilen ab aktueller Position |
| Y | Zeile in den Puffer kopieren |
| nY | n Zeilen in den Puffer kopieren. |
| p | Eine Zeile aus dem Puffer hinter aktueller Zeile einfügen. |
| np | n Zeilen aus dem Puffer hinter aktueller Zeile einfügen. |
| P | Eine Zeile aus dem Puffer vor aktueller Zeile einfügen. |
| nP | n Zeilen aus dem Puffer vor aktueller Zeile einfügen. |
| /suchwort | Nächstes Vorkommen von Suchwort vorwärts suchen. |
| ?suchwort | Nächstes Vorkommen von Suchwort rückwärts suchen. |
| n | Nächstes Vorkommen vorwärts |
| N | Nächstes Vorkommen rückwärts |
| :s/wort1/wort2/ | Ersetzt in der aktuellen Zeile erstes gefundenes wort1 durch wort2 |
| :s/wort1/wort2/g | Ersetzt in der aktuellen Zeile alle wort1 durch wort2 |
| :1,$ s/wort1/wort2/g | Ersetzt von Zeile 1 bis Textende alle wort1 durch wort2 |
| u | Undo |
| . | Redo |
Aliase und Functions
Aliase
Ein neuer Alias kann mit dem Befehl: alias <Kuerzel>='<Kommando>' erzeugt werden.
z.B. alias ll='ls -laF'
Dieser Alias muss dann in der Datei .alias im Homeverzeichnis des Users gespeichert werden.
Die Aliasdatei wird über die nachfolgenden Dateien ausgeführt:
.profile (wird bei jedem login ausgeführt)
.bashrc (wird jedesmal ausgeführt, wenn eine bash geöffnet wird )
In der laufenden Shell kann die .alias Datei über source .alias nachgeladen werden. Dabei ist zu beachten, dass ein einmal geladener Alias nicht überschrieben werden kann. Er muss zuerst mit unalias Befehlsname wieder erntfernt werden. Aufgelistet werden die Aliase über alias.
Functions
Bei Functions ist zu beachten, dass nach der Klammer { immer ein Leerzeichen stehen muss. Jede Anweisung ist mit einem Semikolon abzuschließen.
Aufgehoben werden Funktionen über unset Funktionsname.
Alle Funktionen anzeigen kann man über den Befehl set
Eingetragen werden Funktionen in die Datei .alias im Homeverzeichnis.
Beispiele:
function ff () { find $1 -follow -name "$2"; }
Brace Extention
Bei der Bash und der Korn-Shell können innerhalb von geschweiften Klammern mehrere Alternativen angegeben werden.
So legt der Befehl touch pro{z,c,gr}ess.dat die Dateien prozess.dat, process.dat und grogress.dat an.
Scripting
Ausführen von Scripten
Aufrufen von Scripten
Stellt man dem Aufruf eines Scriptes einen Punkt und ein Leerzeichen voraus, dann wird keine neue Subshell gestartet, sondern das Script wird direkt in der aktuellen Shell ausgeführt. Des weiteren benötigt ein auf diese Weise gestartetes Script kein Ausführungsrecht. Lesen reicht aus.
Bsp.: . myscript
Ausführen ohne Pfadangabe
Damit Scripte ohne den Dateipfad ausgeführt werden können, muss der Pfad zu dem Ordner mit den eigenen Scripten in die Umgebungsvariable $PATH eingetragen werden. Zu diesem Zweck einfach die folgende Zeile in die Datei .bashrc im eigenen Homeverzeichnis eintragen.
export PATH=/<absoluter Pfad zum Home-Bereich>/Scriptordner:$PATH
Danach für die aktuelle Sitzung ein source .bashrc ausführen. Die Scripte im Ordner müssen alle ein Ausführungsrecht haben.
Debuging
Startet man ein Script mit der Option -x, wird jede Anweisung vor der Ausführung angezeigt.
sh -x ./script
Man kann auch die Zeilennummern ausgeben, indem man die Umgebungsvariable PS4 entsprechend belegt.
export PS4='[--- Zeile: $LINENO ---]'
sh -x ./scriptname
Shebang
In der Shebang-Zeile wird dem Rechner mitgeteilt, in welcher Shell das Script ausgeführt werden soll.
#! /bin/sh
Die Zeile ist nicht zwingend erforderlich, gehört aber zum guten Stil. Wenn die Shebang-Zeile nicht vorhanden ist, wird der Aufruf über den exec-Mechanismus an eine Shell des gleichen Typs wie die Aufrufende weitergereicht.
Eingabeparameter
| $# | Die Anzahl der Parameter |
| $0 | Der Name des Scripts |
| $1 | Erster Parameter |
| $* | Alle Parameter |
| $$ | ID des aktuellen Prozesses |
| $? | Rückgabewert des zuletzt ausgeführten Kommandos |
Codebeispiel "Alle Parameter auflisten lassen.":
for i in $*
do
echo $i
done
in $* kann auch weggelassen werden.
Mit der Anweisung shift können alle Parameter um eins nach vorne geschoben werden. Der ursprünglich erste Parameter wird entfernt.
Quotas
Im Gegensatz zur Maskierung einzelner Metazeichen mit \ wird mit Quotas ein ganzer Ausdruck maskiert.
keine Quotas: Dateinamen mit Metazeichen * und ? werden aufgelöst. Systemvariablen werden aufgelöst.
" " Systemvariablen werden aufgelöst.
' ' Keinerlei Auswertung findet statt.
` ` Der Ausdruck wird als eigenes Kommando ausgeführt.
Variablen
Anders als in Hochsprachen wie C müssen Variablen in Scriptsprachen nicht deklariert werden. Sie werden automatisch bei der ersten Verwendung deklariert. Will man auf den gespeicherten Wert der Variablen zugreifen, muss man ein $-Zeichen voranstellen. Der Variablenname darf nie mit einer Zahl anfangen.
Zuweisung: Varname="Hallo"
Ausgabe: echo $Varname
Verwendung in der Mitte von Strings: cp datei.txt ${VarMitPrefix}datei.txt
Umgebungsvariablen:
| $HOME | Eigenes Heimatverzeichnis. |
| $PATH | Enthält alle Pfade, in denen sich ausführbare Dateien befinden. Für die Dateien dieser Ordner braucht beim Aufruf kein Pfad angegeben zu werden. |
| $SHELL | Zeigt den Namen/Pfad der aktiven Shell |
| $LOGNAME | Name des Users |
| $HOST | Name des Rechners |
| $RANDOM | Ausgabe einer Zufallszahl |
Weitere Variablen werden mit dem Komando env ausgegeben.
Kontrollstrukturen
If Verzweigung
if test $# -ne 2
then
echo "Script bitte mit 2 Parametern aufrufen."
fi
If Elseif Verzweigung
if test $# -eq 0
then
echo "Sie haben keinen Parameter eingegeben!"
elif test $# -eq 1
then
echo "Ein Parameter"
elif test $# -eq 2
then
echo "Zwei Parameter"
else
echo "Mehr als zwei Parameter!"
fi
Switch Verzweigung
case $antwort in
merlin) echo "Ich kann zaubern!"
;;
ls) echo "Sie wollen ein Verzeichnis listen!"
;;
find) echo "Sie wollen Dateien finden"
;;
x) echo "Abbruch!"
;;
*) echo "kenn ich nicht!" #Default, kann per '*' maskiert werden.
;;
esac
For Schleife
array=($)
for ((i=0;i<$#; i++))
do
echo ${array[$i]}
done
For Each
for datei in datei1.txt datei2.txt datei3.txt
do
grep --with-filename "$1" $datei
done
for datei in *.txt
do
grep --with-filename "$1" $datei
done
for i in $*
do
echo $i
done
While Schleife
zahl=0
while test $zahl -lt 10
do
echo $zahl
zahl=$((zahl+1))
done
Rechnen in der Shell
Integer-Arithmetik
Die Shell an sich kann nicht rechnen. Dies wird durch das Komando let erledigt. Alle mathematischen Ausdrücke, die in einem Doppelpaar geschwungener Klammern stehen, werden in Wirklichkeit durch das Kommando let ausgewertet.
y=$((8+8))
----
((z=5+5))
echo $z
---
((z=[[5+5))*5))
Ebenso kann mit dem Befehl expr gerechnet werden. Dabei ist zu beachten, dass zwischen den Anweisungen Leerzeichen stehen müssen und dass alle Sonderzeichen wie * oder () maskiert werden müssen.
expr 5 + 5 + 5
expr \( 5 + 5 \) \* 5
Arrays
Arrays können mit dem Befehl Typeset angelegt werden. Diese Deklaration ist aber eigentlich nicht notwendig, es sei denn, man möchte das Array mit einem bestimmten Datentyp oder einem Schreibschutz deklarieren.
| array[3]=drei | Zuweisung eines Wertes |
| array=(null eins zwei drei) | Zuweisung einer Werteliste |
| ${array[3]} | Zugriff auf den Wert eines Arrays |
| echo ${array[*]} | Aufgabe aller Elemente |
| unset array[3] | Löschen des 4. Elementes |
| unset array | Löschen des ganzen Arrays |
| array_kopie=(${array_quelle[*]}) | Kopieren eines Arrays |
| max=${#arr[*]} | Anzahl der Elemente ermitteln |
arr=(null eins zwei drei vier) | Inhalt eines Arrays in einer Schleife ausgeben. |
Optionen
Ein Script kann eigene Optionen haben. Diese müssen direkt nach dem Kommandonamen stehen und können eigene Argumente haben.
Bei jedem Aufruf von getopts wird eine Option weitergeschaltet. Wurde eine Option gefunden, gibt getopts 0 zurück. Alles andere deutet auf einen Fehler oder das Ende hin.
Das nachstehende Script verdeutlicht die Verwendung:
#Aufrufe:
#Scriptname -a
#Scriptname -b
#Scriptname -ab
#Scriptname -c Test
while getopts abc:D: opt
do
case $opt in
a) echo "Option a";;
b) echo "Option b";;
c) echo "Option c : ($OPTARG)";;
d) echo "Option D : ($OPTARG)";;
esac
done
Aktualisiert (Sonntag, den 11. April 2010 um 20:04 Uhr)