LPIC102/105.2 Einfache Skripte anpassen oder schreiben: Unterschied zwischen den Versionen
K (Textersetzung - „angewendet“ durch „angewandt“) |
|||
(53 dazwischenliegende Versionen von 4 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 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. | ||
{|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 | |||
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" | ||
! | ! 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== | ==Ü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]] |
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