Kurzreferenz Linux Shell

In diesen Artikel erhalten Sie einen Überblick über das Scripting unter Linux.   

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.

Modi Vi

Im Eingabemodus:

i (Insert) Einfügen vor der aktuellen Position 
Einfügen am Zeilenanfang 
a(append)Einfügen nach der aktuellen Position 
Einfügen am Zeilenende 
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 nuZeilennummerierung einschalten. 
:set nonu Zeilennummerierung ausschalten.  
:w DateiAktuellen 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 
Zeile in den Puffer kopieren 
nY n Zeilen in den Puffer kopieren. 
Eine Zeile aus dem Puffer hinter aktueller Zeile einfügen.  
np n Zeilen aus dem Puffer hinter aktueller Zeile einfügen.  
PEine Zeile aus dem Puffer vor aktueller Zeile einfügen.  
nPn Zeilen aus dem Puffer vor aktueller Zeile einfügen.  
/suchwortNächstes Vorkommen von Suchwort vorwärts suchen. 
?suchwort Nächstes Vorkommen von Suchwort rückwärts suchen. 
nNächstes Vorkommen vorwärts 
Nächstes Vorkommen rückwärts
:s/wort1/wort2/Ersetzt in der aktuellen Zeile erstes gefundenes wort1 durch wort2 
:s/wort1/wort2/gErsetzt in der aktuellen Zeile alle wort1 durch wort2 
:1,$ s/wort1/wort2/gErsetzt von Zeile 1 bis Textende alle wort1 durch wort2 
uUndo
.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 
$1Erster 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. 
$PATHEnthält alle Pfade, in denen sich ausführbare Dateien befinden.  Für die Dateien dieser Ordner braucht beim Aufruf kein Pfad angegeben zu werden.
$SHELLZeigt den Namen/Pfad der aktiven Shell 
$LOGNAMEName des Users 
$HOSTName des Rechners 
$RANDOMAusgabe 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)
max=${#arr[*]}
echo Max: $max
while ((i<max))
do
        echo "Feld $i ${arr[$i]}"
        i=$((i+1))
done

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)