LPIC102/105.2 Einfache Skripte anpassen oder schreiben: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
Keine Bearbeitungszusammenfassung |
||
(43 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
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 | 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. | Es gibt drei Zeichen, um Kommandos nacheinander auszuführen. | ||
{|class="wikitable" | {|class="wikitable" | ||
Zeile 14: | Zeile 13: | ||
|} | |} | ||
Lange Kommandos, die sich über mehrere Zeilen verteilen, sollten mit einem Backslash | Lange Kommandos, die sich über mehrere Zeilen verteilen, sollten mit einem Backslash \ aufgeteilt werden. | ||
dd of=/dev/zero \ | dd of=/dev/zero \ | ||
if=/.tmp \ | if=/.tmp \ | ||
Zeile 25: | Zeile 24: | ||
*Mit ''ls -l'' kann man die Berechtigungen sehen | *Mit ''ls -l'' kann man die Berechtigungen sehen | ||
*Mit ''chmod'' kann man das Attribut für die Ausführbarkeit gesetzt werden. | *Mit ''chmod'' kann man das Attribut für die Ausführbarkeit gesetzt werden. | ||
# chmod a+x <Skriptdatei> | # chmod a+x <Skriptdatei> // Alle können das Skript ausführen | ||
*<code> | # 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== | |||
{|class="wikitable" | |||
! 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. | |||
*<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=== | |||
Mit den Kommandos ''if, else, elif, fi'' kann man Fallunterscheidungen durchführen. | |||
<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> | |||
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> | |||
[[ | [[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