LPIC102/105.2 Einfache Skripte anpassen oder schreiben

Aus Foxwiki

Mithilfe von Skripten können alltägliche Aufgaben völlig automatisch ablaufen lassen. In Skripten müssen neben Shell-Kommandos auch Befehle fürs Programmieren angewandt werden, z. B. Schleifen wie while oder for und Fallunterscheidungen wie if, else if oder case.

Kommandos verketten

Es gibt drei Zeichen, um Kommandos nacheinander auszuführen.

Zeichen Bedeutung Beispiel
; Kommandos werden nacheinander durchgeführt echo "Dies ist eine Liste";ls -l
&& Kommando 2 wird dann ausgeführt, wenn das erste Kommando erfolgreich war. ls && echo "Vorgang erfolgreich"
|| Kommando 2 wird dann ausgeführt, wenn das erste Kommando erfolglos war. ls /etz || echo "Fehlernummer $?"

Lange Kommandos, die sich über mehrere Zeilen verteilen, sollten mit einem Backslash \ aufgeteilt werden.

dd of=/dev/zero \
if=/.tmp \
bs=1M count=2000 stauts=progress

Ausführung eines Skripts

Ausführungsberechtigung

  • Ein Shell-Skript kann nur dann ausgeführt werden, wenn die Datei auf "ausführbar" gesetzt wird.
  • Mit ls -l kann man die Berechtigungen sehen
  • Mit chmod kann man das Attribut für die Ausführbarkeit gesetzt werden.
# chmod a+x <Skriptdatei> // Alle können das Skript ausführen
# chmod 700 <Skriptdatei> // Nur der Benutzer kann das Skript ausführen
# chmod 4700 <Skriptdatei> // Normale Benutzer können es verwenden, wie der Besitzer des Skripts

Skript ausführen

Ein Beispielskript addi:

#Addiert zwei Variablen
let summe=$1+$2
echo "Die Summe aus $1 und $2 ist $summe."

An die Bash, mitsamt den Parametern, übergeben:

bash /home/user/addi 2 3

Mithilfe des Kommandos source:

source /home/user/addi 5 9

Aus der Textdatei ein ausführbares Shell-Skript machen. Dafür sind zwei Schritte notwendig: Als erstes muss die Datei als "ausführbar" markiert werden.

# chmod 700 addi

Dann muss die Shebangzeile in der Datei eingefügt werden. Diese zeigt an, welche Umgebung das Skript benötigt.

#/bin/bash

oder

#/usr/bin/env bash

Das Skript kann nun ausgeführt werden:

addi 4 4
Die Summe aus 4 und 4 ist 8.

Speicherort eines Skripts

Verzeichnis Bedeutung
/bin Hier kommen die Programme hin, die aus der Distribution kommen und von apt installiert worden sind. Programme, die von Benutzer genutzt werden können.
/sbin Hier kommen die Programme hin, die aus der Distribution kommen und von apt installiert worden sind. Programme, die nur root benutzen kann.
/usr/bin Ähnlich wie /bin
/usr/sbin Ähnlich wie /sbin
/opt Hier kommen die Programme hin, die von apt heruntergeladen und installiert worden sind, aber nicht von der Distribution kommen.
/usr/local/bin Hier kommen selbst kompilierte Programme hinein.
/usr/local/sbin Hier kommen selbst kompilierte Programme hinein, die nur root ausführen darf.
/~/bin Hier kommen selbst kompilierte Programme hinein, die nur der bestimmte Benutzer ausführen darf.

Übergabevariablen und Rückgabewerte

Einige Variablen haben festgelegte Werte.

#!/bin/bash
#Gibt Variablen aus
echo Das script wurde mit $0 gestartet.
echo Sie haben $# Parameter übergeben.
echo Der erste Übergabewert war $1.
echo Der zweite Übergabewer war $2.
Murks
echo Der aktuelle Errorlevel ist $?.
exit 0


Das script wurde mit /home/user/bin/varia gestartet.
Sie haben 2 Parameter übergeben.
Der erste Übergabewert war 59.
Der zweite Übergabewert war 33.
/home/user/bin/varia: Zeile 7: Murks: Kommando nicht gefunden.
Der aktuelle Errorlevel ist 127.
  • Die Variable $0 enthält den Namen des aufrufenden Programms.
  • Die Variable $# zeigt die Anzahl der übergebenen Parameter an.
  • $1 und $2 sind Übergabewerte
  • $? zeigt den Errorlevel des zuletzt aufgerufen Kommandos an.

Skripte schreiben mit Shell-Kommandos

Die for-Schleife

#!/usr/bin/env bash
#Zählt bis 10
for ((z=0; z<=10; z++))
    do
    echo $z
    done
unset z
exit 0

Ein anderes Beispiel:

#!/bin/bash
#Sucht nach Dateien mit dem SUID-Bit
for z in $(find / -perm -4000)
do
   echo -e "\n$z hat ein SUID-Bit und ist möglicherweise gefährlich!"
done
unset z
exit 0

Die while-Schleife

#!/bin/bash
#Addiert beliebig viele Zahlen
summe=0
while test $# -gt 0
   do
       let summe=summe+$1
       shift
   done
echo Die Summe ihrer Eingaben ist $summe
unset summe
exit 0
  • Eine while-do-done Schleife
  • Nach do folgen Anweisungen, die sich wiederholen. Mit done wird die Sequenz beendet und es beginnt von vorne.
  • shift verschiebt die Übergabewerte. D.h. aus $2 wird $1, aus $3 wird $2 und so weiter.
  • while test $# -gt 0 ist eine Abbruchbedingung und bedeutet in etwa:"Solange die Anzahl der verbleibenden Übergabewerte größer als null ist, dann ..."

Die Ausführung und Ausgabe sieht so aus:

$ betteraddi 7 3 6 4 2 7 9
Die Summe ihrer Eingaben ist 38
  • Man kann test auch durch eckige Klammern ersetzen: while [ $# -gt 0 ]
  • Der Befehl test hat viele Optionen und Parameter, hier ein kleiner Ausschnitt
Option Beschreibung
-r <Datei> Datei existiert und ist lesbar
-w <Datei> Datei existiert und ist beschreibbar
-d <Datei> Datei existiert und ist ein Verzeichnis
-u <Datei> Datei exisitert und das SUID-Bit ist gesetzt
-f <Datei> Datei existiert und ist eine normale Datei
<Datei1> -nt <Datei2> Datei 1 ist neuer als Datei 2
<Wert1> -eq <Wert2> Wert 1 ist gleich Wert 2

Fallunterscheidungen

Mit den Kommandos if, else, elif, fi kann man Fallunterscheidungen durchführen.

#!/usr/bin/env bash
#Einfaches Rechnen
clear; echo -e "Welche Operation wollen Sie ausführen?\n
Bitte den ersten Buchstaben eingeben und mit Enter bestätigen\n"
echo -e "            [a]ddieren
            [s]ubtrahieren
            [m]ultiplizieren
            [d]ividieren "
read operator
clear; echo -e "Geben Sie den ersten Wert ein: "
read a
clear; echo -e "Geben Sie 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 "Sie haben einen ungültigen Operator eingegeben!"
    exit 1
fi
exit 0

Eine andere Art der Fallunterscheidung ist case, esac

#!/usr/bin/env bash
#Einfaches Rechnen
clear; echo -e "Welche Operation wollen Sie ausführen?\n
Bitte den ersten Buchstaben eingeben und mit Enter bestätigen\n"
echo -e "            [a]ddieren
            [s]ubtrahieren
            [m]ultiplizieren
            [d]ividieren "
read operator
clear; echo -e "Geben Sie den ersten Wert ein: "
read a
clear; echo -e "Geben Sie 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 "Sie haben einen ungültigen Operator eingegeben!"
    exit 1;;
esac
exit 0