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[Bearbeiten | Quelltext bearbeiten]

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[Bearbeiten | Quelltext bearbeiten]

Ausführungsberechtigung[Bearbeiten | Quelltext bearbeiten]

  • 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[Bearbeiten | Quelltext bearbeiten]

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[Bearbeiten | Quelltext bearbeiten]

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[Bearbeiten | Quelltext bearbeiten]

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[Bearbeiten | Quelltext bearbeiten]

Die for-Schleife[Bearbeiten | Quelltext bearbeiten]

#!/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[Bearbeiten | Quelltext bearbeiten]

#!/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[Bearbeiten | Quelltext bearbeiten]

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