LPIC102/105.2 Einfache Skripte anpassen oder schreiben: Unterschied zwischen den Versionen

Aus Foxwiki
K (Textersetzung - „angewendet“ durch „angewandt“)
 
(53 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
=Allgemeines=
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''.


Für die Benennung des Skriptes, ist es sehr wichtig '''keine''' Sonderzeichen einzufügen, sowie vorhandene Befehle zu benutzen.
==Kommandos verketten==
Allgemein werden Skripte meist in Textdateien geschrieben.


==Wichtige Inhalte in einem Skript==
Es gibt drei Zeichen, um Kommandos nacheinander auszuführen.
{|class="wikitable"
!Zeichen !! Bedeutung !! Beispiel
|-
| ; || Kommandos werden nacheinander durchgeführt || <code>echo "Dies ist eine Liste";ls -l</code>
|-
| && || Kommando 2 wird dann ausgeführt, wenn das erste Kommando erfolgreich war. || <code>ls && echo "Vorgang erfolgreich"</code>
|-
| <nowiki>||</nowiki> || Kommando 2 wird dann ausgeführt, wenn das erste Kommando erfolglos war. || <code>ls /etz <nowiki>||</nowiki> echo "Fehlernummer $?"</code>
|}


*Standard-Syntax verwenden (sh)
Lange Kommandos, die sich über mehrere Zeilen verteilen, sollten mit einem Backslash \ aufgeteilt werden.
*Kommandosubstitutionen verwenden
dd of=/dev/zero \
*verkettete Kommandos ausführen
if=/.tmp \
**es werden mehrere Befehle in einer einzigen Befehlszeile ausgeführt
bs=1M count=2000 stauts=progress
**werden mit einem Semikolon (;) getrennt
**Beispiel: # df -h;free -m
**-> Zunächst zeigt es die Festplattenbelegung, anschliessend die Speicherverwendung
*situationsabhängig Mail an den Superuser senden


==Position eines Skriptes==
==Ausführung eines Skripts==


Falls man ein Skript öfter benötigt, wäre es sinnvoll ein Verzeichnis auszuwählen, dass auf die PATH-Variable zeigt.
===Ausführungsberechtigung===
*/usr/bin ist gut geeignet für systemweite und für jeden zugänglich
*Ein Shell-Skript kann nur dann ausgeführt werden, wenn die Datei auf "ausführbar" gesetzt wird.
*/usr/sbin ist gut geeignet für durchgeführte administrative Eingriffe oder auch nicht für normale Benutzer anwendbar sein sollen
*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


==Wichtige Dateien, Verzeichnisse und Anwendungen==
===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==


{|class="wikitable"
{|class="wikitable"
!Zeichen !! Beschreibung
! Verzeichnis !! Bedeutung
|-
|-
| <nowiki>for</nowiki> || -
| ''/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.
|-
|-
| <nowiki>&&</nowiki> || bei diesem Zeichen wird der zweite Befehl nur ausgeführt, wenn der erste erfolgreich war
| ''/sbin'' || Hier kommen die Programme hin, die aus der Distribution kommen und von apt installiert worden sind. Programme, die nur root benutzen kann.
|-
|-
| <nowiki>||</nowiki> || bei diesem Zeichen wird der zweite Befehl nur ausgeführt, wenn der erste fehlgeschlagen ist
| ''/usr/bin'' || Ähnlich wie ''/bin''
|-
|-
| <nowiki>while</nowiki> || -
| ''/usr/sbin'' || Ähnlich wie ''/sbin''
|-
|-
| <nowiki>test</nowiki> || -
| ''/opt'' || Hier kommen die Programme hin, die von apt heruntergeladen und installiert worden sind, aber nicht von der Distribution kommen.
|-
|-
| <nowiki>read</nowiki> || -
| ''/usr/local/bin'' || Hier kommen selbst kompilierte Programme hinein.
|-
|-
| <nowiki>if</nowiki> || -
| ''/usr/local/sbin'' || Hier kommen selbst kompilierte Programme hinein, die nur root ausführen darf.
|-
|-
| <nowiki>seq</nowiki> || -
| ''/~/bin'' || Hier kommen selbst kompilierte Programme hinein, die nur der bestimmte Benutzer ausführen darf.
|-
| <nowiki>exec</nowiki> || Erklärung im unteren Teil des Artikels. (Sonstiges)
|}
|}


==Übergabevariablen und Rückgabewerte==
==Übergabevariablen und Rückgabewerte==


==Grundrechenarten==
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.
*<code>while test $# -gt 0</code> 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: <code>while [ $# -gt 0 ]</code>
*Der Befehl ''[[Befehl test|test]]'' hat viele Optionen und Parameter, hier ein kleiner Ausschnitt
 
{|class="wikitable"
!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===


Es gibt vier verschiedene Grundrechenarten, mit denen man im Skripten arbeiten und rechnen kann.
Mit den Kommandos ''if, else, elif, fi'' kann man Fallunterscheidungen durchführen.
  clear; echo -e "\nGeben Sie jetzt den ersten Wert ein  "
  read a
  clear; echo -e "\nGeben Sie jetzt den zweiten Wert ein  "
  read
Damit wurde ein Wert für die Varibale "a" und "b" gesetzt.
*[a]ddieren
  if [$operator=a]; then
        let c=a+b
        clear; echo $a + $b = $c
*[s]ubtrahieren
  elif [ $operator=s]; then
          let c=a-b
          clear; echo $a – $b = $c
*[m]ultiplizieren
  elif [ $operator=m]; then
          let c=a*b
          clear; echo $a "*" $b = $c
*[d]ividieren
  elif [ $operator=d]; then
          let c=a/b
          clear; echo $a / $b = $c


==Sonstiges==
<pre>
#!/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
</pre>


Mit Exec kann man ein externes Programm oder ein anderes Skript aufrufen, dabei wird der laufenden Prozess / das laufende Skript automatisch beendet und ersetzt.
Eine andere Art der Fallunterscheidung ist ''case, esac''
<pre>
#!/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
</pre>


[[Category:Linux]]
[[Kategorie:Linux/LPIC/102]]

Aktuelle Version vom 18. August 2023, 12:05 Uhr

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