Inhaltsverzeichnis

Shellprogrammierung


Wird ein Script ausgeführt, sorgt die Shebang Zeile (#!) dass die jeweilige Shell aufgerufen wird. Variablen, die vorher nicht exportiert wurden, werden in einer neuen Shell auch nicht mehr zur verfügung stehen. Beendet man das Script kann man die Variablen ebenfalls nicht mehr benutzen. Die „export“ Funktion steht auch nur für Subshells und nicht für übergeordnete Shells zur Verfügung.

Skripte, die für jeden Nutzer zugänglich sein sollen kann man in „/usr/bin/“ oder „/usr/local/bin/“ speichern. Skripte, die administrative Eingriffe ausführen, können in „/usr/sbin/“ gespeichert werden.



Skripte ausführen


Ein Shellskript ist eine ausführbare Textdatei. Befindet sich das Skript in einem in der $PATH Variablen beschriebenen Verzeichnis, ist zum Ausführen des Skripts nur der Skriptname notwendig. Es gibt verschiedene Methoden ein Shellskript auszuführen.


Syntax:




Beispiel:

uwe@home:~/workspace$ ./add.sh 7 7
Die Summe von 7 + 7 = 14




Die Datei muß natürlich ausführbar sein.

uwe@home:~/workspace$ ll
insgesamt 4
-rwxr-xr-- 1 uwe uwe 104  7. Nov 16:27 add.sh




Die Ausgabe eines Skripts kann auch direkt in eine Mail umgeleitet werden.

hans@home:~$ ./bak | mail -s Backups root





Aufbau eines Skripts


  1#!/bin/bash
  2 # Name: add.sh
  3 # Addiere zwei Werte
  4 let summe=$1+$2
  5 echo "Die Summe von $1 + $2 = $summe"

In der ersten Zeile befindet sich das She Bang Zeichen, das zeigt, dass es sich um ein ausführbares Programm handelt und definiert mit welchem Interpreter das Skript ausgeführt wird. Danach folgt der Dateiname (Optional) und eine Kurzbeschreibung (Optional). Ab Zeile vier folgen die Anweisungen.


Bei „init“ Skripte sollte ein kompletter „head“ verwendet werden.

#!/bin/bash
 
# xxx-Script
 
### BEGIN INIT INFO
# Provides:          xxx
# Required-Start:    $local_fs
# Required-Stop:     $local_fs
# Should-Start:
# Should-Stop:
# Default-Start:     S
# Default-Stop:      0 6
# Short-Description: xxx script
### END INIT INFO

# Anweisungen





Übergabevariablen und Rückgabewerte


Wenn beim Start eines Skripts Werte übergeben, oder ein Rückgabewert ausgegeben werden soll, können diese im Skript als Variablen aufgefangen werden. Dafür gibt es Automatische Variablen in der Shell.


Übergabevariablen:




Rückgabewerte:





Beispiel:

  1 #!/bin/bash
  2 # Uerbergabevariablen ausgeben.
  3 echo "Das Skript wurde mit dem Kommando $0 gestartet"
  4 echo "Die Prozessnummer des Skripts ($0) lautet: $$"
  5 echo "Es wurden $# Parameter uebergeben"
  6 echo "Der erste Parameter lautet: $1"
  7 echo "Der zweite Parameter lautet: $2"
  8 Huchhh...
  9 echo "Der aktuelle Errorlevel lautet: $?"
 10 exit 0



uwe@home:~$ ./uvar.sh 3 7
Das Script wurde mit dem Kommando ./uvar.sh gestartet
Die Prozessnummer des Scripts (./uvar.sh) lautet: 3332
Es wurden 2 Parameter uebergeben
Der erste Parameter lautet: 3
Der zweite Parameter lautet: 7
./uvar.sh: Zeile 8: Huchhh...: Kommando nicht gefunden.
Der aktuelle Errorlevel lautet: 127





test


„test“ ist ein Programm zum Dateitypen überprüfen und Werte vergleichen. Das Programm wird mit einem Exit-Status gemäß „AUSDRUCK“ beendet.


Syntax:




Ausdruck:




Außer den Tests [-h] und [-L] werden symbolische Links von allen DATEI-Tests dereferenziert. Zu bedenken ist, dass runde Klammern für Shells mit Back‐Slashes maskiert werden müssen \(…\).





Escape Sequenzen


Der Parameter „echo -e“ aktiviert Escape Zeichen bei der Ausgabe.


Escape Zeichen:





Schleifen - Bedingungen


if elif else



#!/bin/bash
# Grundrechenarten
clear;
echo -e "Welche Operation möchten Sie ausführen?\nBitte den ersten Buchstabe    n eingeben und mit Enter bestätigen.\n"
echo -e "[a]ddieren\n[s]ubtrahieren\n[m]ultiplizieren\n[d]ividieren\n"
read operator
clear;
echo -e "\nGeben Sie bitte den ersten Wert ein "
read a
clear;
echo -e "\nGeben Sie bitte den zweiten Wert ein "
read b
 
if [ $operator = a ]; then
         let c=a+b
         clear;
         echo $a + $b = $c
 
elif [ $operator = s ]; then
         let c=a-b
         clear;
         echo $a - $b = $c
 
elif [ $operator = m ]; then
         let c=a*b
         clear;
         echo $a "*" $b = $c
 
elif [ $operator = d ]; then
         let c=a/b
         clear;
         echo $a / $b = $c
 
else
clear;
echo -e "\nSie haben einen Ungültigen Operator angegeben!"
exit 1
fi
exit 0



hans@home:~$ ./rechne



Welche Operation möchten Sie ausführen?
Bitte den ersten Buchstaben eingeben und mit Enter bestätigen.

[a]ddieren
[s]ubtrahieren
[m]ultiplizieren
[d]ividieren

m



Geben Sie bitte den ersten Wert ein 
6



Geben Sie bitte den zweiten Wert ein 
7



6 * 7 = 42





case


Hier wird das obige Skript Beispiel mit einer „case“ Fallunterscheidung verwendet.


#!/bin/bash
# Grundrechenarten
clear;
echo -e "Welche Operation möchten Sie ausführen?\nBitte den ersten Buchstabe    n eingeben und mit Enter bestätigen.\n"
echo -e "[a]ddieren\n[s]ubtrahieren\n[m]ultiplizieren\n[d]ividieren\n"
read operator
clear;
echo -e "\nGeben Sie bitte den ersten Wert ein "
read a
clear;
echo -e "\nGeben Sie bitte den zweiten Wert ein "
read b
 
case "$operator" in
         a)
         let c=a+b
         clear;
         echo $a + $b = $c;;
 
         s)
         let c=a-b
         clear;
         echo $a - $b = $c;;
 
         m)
         let c=a*b
         clear;
         echo $a "*" $b = $c;;
 
         d)
         let c=a/b
         clear;
         echo $a / $b = $c;;
 
         *)
         clear;
         echo -e "\nSie haben einen Ungültigen Operator angegeben!"
         exit 1;;
esac
exit 0





for




  1 # !/bin/bash
  2 # Sicherungskopien im Homeverzeichnis suchen.
  3 
  4 for a in $(find /home -name *.old)
  5 do
  6         echo -e "\n$a ist eine Sicherungskopie"
  7 done    
  8 unset a
  9 exit 0

Das „find“ Kommando in Zeile 4 kann auch in Backquotes geschrieben werden.


for a in `find /home -name *.old`




user@home:~$ ./bak
...
/home/user/.xsession-errors.old ist eine Sicherungskopie
...

Die Ausgabe des „find“ Befehls wird der Variablen (a) übergeben. Nach jeder Übergabe wird die „for“ Schleife durchlaufen. „echo -e“ aktiviert die Escape Sequenzen, dadurch kann mit „\n“ ein Zeilenumbruch durchgeführt werden.



while




  1 #!/bin/bash
  2 # Name: add_1.sh
  3 # Beliebig viele Zahlen addieren.
  4 summe=0
  5 
  6 while test $# -gt 0
  7         do
  8         let summe=summe+$1
  9         shift
 10         done
 11 echo "Die Summe der Werte = $summe"
 12 unset summe
 13 exit 0



paul@jhome:~$ ./add_1.sh 29 21
Die Summe der Werte = 50

In dieser Schleife wird, sofern die Numerischen Argumente „greater than“ (-gt) [0] und mit der Variablen „summe“ addiert. „shift“ sorgt dafür, dass die Arumente beim auslesen un eins nach links verschoben werden. Aus $2 wird $1 usw.



Cloud