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

Aus Foxwiki
Jasperschuny (Diskussion | Beiträge)
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(68 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.
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>
|}
 
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


==Wichtige Inhalte in einem Skript==
oder


*Standard-Syntax verwenden (sh)
#/usr/bin/env bash
*Kommandosubstitutionen verwenden
*verkettete Kommandos ausführen
**es werden mehrere Befehle in einer einzigen Befehlszeile ausgeführt
**werden mit einem Semikolon (;) getrennt
**Beispiel: archangel:/ # df -h;free -m
**-> Zunächst zeigt es die Festplattenbelegung, anschliessend die Speicherverwendung
sowie einige weitere


==Position eines Skriptes==
Das Skript kann nun ausgeführt werden:


Falls man ein Skript öfter benötigt, wäre es sinnvoll ein Verzeichnis auszuwählen, dass auf die PATH-Variable zeigt.
addi 4 4
*/usr/bin ist gut geeignet für systemweite und jeden zugänglich
Die Summe aus 4 und 4 ist 8.
*/usr/sbin ist gut geeignet für durchgeführte administrative Eingriffe oder auch nicht für normale Benutzer anwendbar sein sollen


==Wichtige Dateien, Verzeichnisse und Anwendungen==
==Speicherort eines Skripts==


{|class="wikitable"
{|class="wikitable"
!Zeichen !! Beschreibung
! 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.
|-
|-
| <nowiki>for</nowiki> || -
| ''/usr/local/bin'' || Hier kommen selbst kompilierte Programme hinein.
|-
|-
| <nowiki>&&</nowiki> || bei diesem Zeichen wird der zweite Befehl nur ausgeführt, wenn der erste erfolgreich war
| ''/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.
*<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
|-
|-
| <nowiki>||</nowiki> || bei diesem Zeichen wird der zweite Befehl nur ausgeführt, wenn der erste fehlgeschlagen ist  
|''-r'' <Datei> || Datei existiert und ist lesbar
|-
|-
| <nowiki>while</nowiki> || -
|''-w'' <Datei> || Datei existiert und ist beschreibbar
|-
|-
| <nowiki>test</nowiki> ||
|''-d'' <Datei> || Datei existiert und ist ein Verzeichnis
|-
|-
| <nowiki>read</nowiki> ||
|''-u'' <Datei> || Datei exisitert und das SUID-Bit ist gesetzt
|-
|-
| <nowiki>if</nowiki> ||
|''-f'' <Datei> || Datei existiert und ist eine normale Datei
|-
|-
| <nowiki>seq</nowiki> ||
|''<Datei1> -nt <Datei2>'' || Datei 1 ist neuer als Datei 2
|-
|-
| <nowiki>exec</nowiki> || Erklärung im unteren Teil des Artikels. (Sonstiges)
|''<Wert1> -eq <Wert2>'' || Wert 1 ist gleich Wert 2
|}
|}
sowie einige weitere


==Grundrechenarten==
===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.
*[a]ddieren
*[s]ubtrahieren
*[m]ultiplizieren
*[d]ividieren


==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]]
[[Kategorie:Bash/Scripting]]

Aktuelle Version vom 8. August 2024, 00:29 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

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