Literatur (Links) -...
Transcript of Literatur (Links) -...
2WIS – SS 2020 - Teil 4/bash
Literatur (Links)
[4-1] http://www.tldp.org/LDP/Bash-Beginners-Guide/html/index.html
[4-2] http://matt.might.net/articles/bash-by-example/
[4-3] https://www.thegeekstuff.com/2010/08/bash-shell-builtin-commands/
[4-4] https://www.gnu.org/software/bash/manual/html_node/index.html
[4-5] http://openbook.rheinwerk-verlag.de/shell_programmierung/shell_006_003.htm
[4-6] https://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html
[4-7] https://www.linuxwiki.de/crontab
3WIS – SS 2020 - Teil 4/bash
Überblick
� Variablen
� Datentypen
� Kontrollkonstrukte
� Beispiele für Skript-Bausteine
� cron-Jobs
4WIS – SS 2020 - Teil 4/bash
Prinzipien der Shell-Programmierung I
� Shells können interaktiv arbeiten oder eine Skript ausführen.
� Die Skripte können geschachtelt aufgerufen werden.
� Skript = Ausführbare Datei mit ASCII-Kommandos
� In Linux werden die Skript-Dateien wie Kommandos behandelt, so dass für den Aufrufer kein Unterschied zu "normalen" Kommandos besteht.
5WIS – SS 2020 - Teil 4/bash
Prinzipien der Shell-Programmierung II
� Variablen werden mit einem einleitenden $ markiert, z.B. $index.
� Es ist auch möglich den Namen in {} zu setzen, z.B. ${10}
� Shell-Variablen werden nicht deklariert.
� Sie besitzen den Typ des Ausdrucks der letzten Zuweisung.
� Es gibt zwei Typen für Werte:– String
– Integer
� Die Operationen unterscheiden sich etwas bei den beiden Typen.
� Shell-Variablen gelten immer nur für den betreffenden Shell; aufgerufene Programme oder andere Shells haben darauf keinen Zugriff.
6WIS – SS 2020 - Teil 4/bash
� Expliziter Aufruf eines Skriptes als Kommando:
[bash] Kommando [arg1] [arg2]... [argn]
Kommando: Dateiname des Skriptsarg1... argN: Parameter als Zeichenkette
� Parameter = Argument = Zeichenkette, die angibt womit oder wie etwas geschehen soll
� Die Zeichen innerhalb [] sind optional.
� ... zeigt mögliche Wiederholungen an.
� Beispiele:bash Beispiel a b c
Beispiel a b c
./Beispiel a b c
Syntax der Skriptsprache I
7WIS – SS 2020 - Teil 4/bash
Syntax der Skriptsprache II - Erläuterungen
� Ein Skript kann auf zwei Arten ausgeführt werden:– bash Name Parameter...
wobei Name der Name einer Datei ist
– Name Parameter...wobei die Datei Name ausführbar sein muss und in der 1. Zeile eine spezielle Markierung (siehe unten) hat
� Jedes syntaktische Element wird durch ein Leerzeichen getrennt – Ausnahme: Strings in " eingeschlossen.
Dies gilt beim Aufruf, aber auch innerhalb des Skripts.Beispiele:
$abc ist ein Element (hier: eine Shell-Variable)
$ abc sind zwei Elemente
"$ abc" ist ein Element (hier: ein String)
8WIS – SS 2020 - Teil 4/bash
Der/Die Shell Bourne again Shell (bash)
� Shells sind Kommando-Interpreter mit einer eigenen Sprache.
� Die Kommandos werden von der Tastatur gelesen oder aus einer Datei.
Option Erläuterung
-x Es werden die auszuführenden Kommandos ausgegeben (Trace)
Aufruf-Parameter für bash
9WIS – SS 2020 - Teil 4/bash
Parameter und Variablen I
� Zugriff auf Variablen innerhalb der Skript-DateiVariablen beginnen mit $ gefolgt von folgenden Zeichen:
Der Unterschied zwischen $* und $@ besteht darin, dass bei $@ dieAnzahl der Parameter immer erhalten bleibt, auch dann, wenn ein Blankzu einem Parameterwert gehört. Z.B. bei abc w "x y z" hat $* den Wert"w x y z" (4 Werte) und $@ den Wert 'w "x y z"' (2 Werte).
$1..$9 Parameter, z.B. $1 steht für 1. Parameter$0 $0 steht für den Namen des Skripts$* Alle Parameter von $1 beginnend zusammengesetzt$@ Alle Parameter von $1 beginnend zusammengesetzt$$ Prozessnummer des Shells$? Returncode des letzten Kommandos$# Anzahl der Parameter $Name Variable, z. B. $index
10WIS – SS 2020 - Teil 4/bash
Parameterzuordnungen I
Aufruf: bash copy bla blue
ShellnameSkriptname
1. Parameter
2. Parameter
copy: cp $1 $2
Datei Zuordnungen$0 = copy$1 = bla$2 = blue$3 =....
Ersetzen (Substituieren)
Ausführen: cp bla blue
11WIS – SS 2020 - Teil 4/bash
Parameterzuordnungen II
� Auch wenn das Skript mit bash aufgerufen wird, ist der dem Namen des Skripts folgende Parameter der erste!Die Angabe des Shellprogramms selbst, z.B. bash, zählt nicht bei der Nummerierung.
� Beispiel:– bash copy von bis – copy von bis
"von" ist in beiden Fällen der 1. und "bis" immer der 2. Parameter
12WIS – SS 2020 - Teil 4/bash
Parameter und Variablen II
� $0..$9, $*, $@ und $$ sind 2-buchstabige Elemente, auch wenn kein Leerzeichen folgt!Z.B. $10 sind zwei Elemente: $1 und 0
� Es ist nur der Zugriff auf die ersten 9 Parameter mit $1..$9 möglich. Alle weiteren werden mit ${NR} addressiert.
� Mit $* bzw. $@ lässt sich die ganze Liste ansprechen.
Alle Variablen und Parameter sind immer lokal innerhalb des Shells,globale Werte können nur durch Exportieren in das Environment anKindprozesse weitergegeben werden.
13WIS – SS 2020 - Teil 4/bash
Setzen von Variablen I
� Eine Shell-Variable wird nach folgendem Schema gesetzt:
Variable=Wert
● Der Wert wird in " eingeschlossen, wenn er als String (Daten) interpretiert wird.
● Vor und nach dem = dürfen keine Blanks stehen.
� Beispiele für Wert als Zeichenkette:– suffix=".txt"
– Datei=/home/blaba/file$suffix
– suffix=$suffix:$suffix
� Der Wert kann selbst wieder Variablen enthalten, die bei der Zuweisung expandiert werden.
� Soll die Expansion unterbleiben, muss die Bedeutung der $-Zeichen per Backslash ausgeschaltet werden: \$Dann wird das \ entfernt.
14WIS – SS 2020 - Teil 4/bash
� Wenn die Ausgabe eines Kommandos den Wert bilden soll, dann muss das Kommando in ` eingeschlossen werden:
Variable=`Kommando Parameter`
� Beispiele– Liste=`cat $2`
– CMD=`ps | tail -1`
� Die Ausgabe der Kommandos bildet den Wert der Variablen.
� Bitte beachten Sie, dass es drei Quotes gibt:´ ` ' Hier ist das Back-Tick genannte nach links gekippte Quote gemeint.
� Es gibt noch eine zweite Form: $(...Kommando...).
Setzen von Variablen II
15WIS – SS 2020 - Teil 4/bash
Ausgeben von Shell-Variablen (Debugging)
� Mit dem Kommando echo können Texte und damit auch Parameter ausgegeben werden.
� Beispiele:echo "Hallo World!"
echo Hallo World!
echo $0 $1 $2 $3
echo $USER $HOME
echo $bla
� Auflisten der bash-Tätigkeit: set -xDies wieder aufheben: set +x
In einer Zeile beginnend mit einem + wird die Zeile vor der Ausführung so ausgegeben, wie sie ausgeführt wird, d.h. alle Variablen sind expandiert.
16WIS – SS 2020 - Teil 4/bash
Spezielle Kommentarzeile
� "#!/bin/bash" in der ersten Zeile erzwingt die Benutzung von bash
� "#!XYZ" in der 1. Zeile bedeutet: Starte Programm XYZ mit dem Filenamen als 1. Parameter
� Typische Anwendung(außerhalb der Shell-Programmierung):
– #!/usr/bin/env python3
– #!/usr/bin/php
17WIS – SS 2020 - Teil 4/bash
Alias-Mechanismus
� Einfacher Makromechanismus, teilweise mit Parameter
alias Makroname=Makrokörper
� Beispiele– alias ..="cd .."
Durch Eingabe von .. wird ein Ordner höher gegangen
– alias .="echo \$PWD"Durch Eingabe von . wird dann der Name des Arbeitsordners ausgegebenDer \ schaltet die Expansion bei der Definition aus.
– unalias Name
Verwerfen des alias Name
18WIS – SS 2020 - Teil 4/bash
History-Mechanismus (Auszug)
Syntax Bedeutung
!! Letztes Kommando
!$ Letzter Parameter des letzten Kommandos
Das Abspeichern der History in einer Datei enthält das Sicherheitsloch,bei dem auch Passwörter in Kommandos später erfahren werden können.
19WIS – SS 2020 - Teil 4/bash
Das IF-Konstrukt I
� test Bedingung
� [ Bedingung ]
if Condition ;then .....fi
if Condition ;then .....else .....fi
Condition kann sein
� -a Datei Frage, ob Datei existiert
� -d DateiFrage, ob Datei Ordner ist
� -f Datei Frage, ob Datei normal ist
� -r Datei Frage, ob Datei lesbar ist
Dateiabfrage kann sein
� String1 = String2
� String1 != String2
Stringvergleich kann sein
Das sind echte []Keine Option
Das gilt nur fürStrings, für Integerist die Syntax anders
20WIS – SS 2020 - Teil 4/bash
Das IF-Konstrukt II
� Der bash(1) ist in einigen Fällen etwas launisch, was die Syntax betrifft:– Vor und hinter den [] sollte jeweils ein Blank stehen, danach ein
Semikolon– Alle Schlüsselworte werden klein geschrieben.– Die then/else-Blöcke sollten mit mindestens einem Blank nach
rechts eingerückt werden.
� Abfrage auf einen leeren Parameter– Durch String-Vergleich:
if [ "a$1" = "a" ]; then
– Durch -z (True falls leer) oder -n (Länge >0): if [ -z "$1" ]; then
21WIS – SS 2020 - Teil 4/bash
Beispiele für IF I
if test "abc" = "$param" ; then echo Param hat den Wert abcelse echo Param hat den Wert: $paramfi
if [ "abc" = "$param" ] ; then echo Param hat den Wert abcelse echo Param hat den Wert: $paramfi
Beide Beispielesind gleichwertig.
Es wird abgefragt, ob die Shell-Variable $param denWert "abc" hat.
22WIS – SS 2020 - Teil 4/bash
Beispiele für IF II
if test -a /bin/ls ; then echo es gibt ein ls-Kommandofi
if [ -a $2 ] ; then echo der 2. Parameter ist ein Filenamefi
In diesem Beispiel wird abgefragt, ob die Datei /bin/ls zugreifbar ist (a wie accessible).
Hier wird analog geprüft, ob der 2. Parameter $2 einenNamen einer zugreifbaren Datei enthält.
23WIS – SS 2020 - Teil 4/bash
FOR-Konstrukt I
for Index in Liste do .. $Index .. done
� Wobei Index der Name einer Variablen ohne $ und Liste eine durch Blanks getrennte Liste von Zeichenketten ist.
� Die Schleife wird mit gesetzter Variablen $Index (jetzt mit $) für jedes Element in der Liste in der angegebenen Reihenfolge von links nach rechts durchlaufen.
24WIS – SS 2020 - Teil 4/bash
FOR-Konstrukt II
for Laufvar in a b c do echo $Laufvar done
Schleifenkopf
Schleifenkörper
� Der Schleifenkopf gibt den Namen der Laufvariablen sowie die Werte der Laufvariablen an.
� Der Laufvariablen wird für jeden Lauf eine Zeichenkette aus der Liste zugewiesen - es wird bei dieser Form weder addiert noch subtrahiert.
� Die Deklaration der Laufvariable im Kopf muss ohne $ erfolgen, da sie sonst zum Beginn durch nichts ersetzt wird (vor der Ausführung werden ja alle $-Variablen ersetzt.
25WIS – SS 2020 - Teil 4/bash
FOR-Konstrukt III
for i in {1..12} do ... $i ... done
for i in {0..12..2} do ... $i ... done
� In dieser Variante verhält sich die FOR-Schleife so wie aus anderen Sprachen gewohnt:– Der 1. Wert nach dem { ist der Start-Wert.
– Der 2. Wert ist der End-Wert.
– Der optionale 3. Wert ist das Increment.
� Die Variable i ist hier vom Typ Integer.
26WIS – SS 2020 - Teil 4/bash
Bausteine I
for elem in `cat Liste`do echo -n print file $elem... lpr $elemdoneecho ready
rpm -i --test $1if [ $? -eq 0 ] ; then echo "$1 kann installiert werden"else echo "$1 geht hier nicht"fi
Hier wird derDatentypIntegerbenutzt.
27WIS – SS 2020 - Teil 4/bash
Bausteine II
#!/bin/bash# Es wird von jeder übergebenen Datei ein Backup gemacht## Version 1 1/6/2006if [ $# -eq 0 ] ; then echo `basename $0`: Aufruf `basename $0` Datei1 Datei2... exit 1fifor fn in $@do if test -e $fn ; then cp $fn $fn.back else echo `basename $0`: Datei $fn existiert nicht fidoneexit 0
28WIS – SS 2020 - Teil 4/bash
Bausteine III
echo "Bitte Vor- und Nachnamen eingeben!"read Vor Nachecho Hallo $Vor $Nach
29WIS – SS 2020 - Teil 4/bash
Bausteine IV
if [ $# -ne 2 ] ; thenecho "Usage: `basename $0` ..... "exit 1
fi
rootUID=0if [ "$UID" -ne $rootUID ] ; then
echo "must be root to run this script"exit 1
fi
30WIS – SS 2020 - Teil 4/bash
Dateien innerhalb von Skripten erzeugen I
Befehl Parameter...<<String......String
Der Teil zwischen den beiden Strings wird als Standard-Inputdem Befehl übergeben.
Achtung! Variablen wie $xyz werden ersetzt.Sollen die $ erhalten bleiben, so muss ein \ davor stehen.
31WIS – SS 2020 - Teil 4/bash
Dateien innerhalb von Skripten erzeugen II
ls >/tmp/fileed /tmp/file << E-O-F:1,$s/^/ren /:w:qE-O-Fbash /tmp/file
ls >/tmp/fileed /tmp/file << E-O-F:1,\$s/^/ren /:w:qE-O-Fbash /tmp/file
Die linke Version wird wegen des Ersetzens $s durch Nichts nicht laufen.
Allen Dateinamen des aktuellen Ordners wird jeweils in ihrerZeile zum Beginn ein "ren " vorgestellt. Diese ren-Datei wird dannin bash /tmp/file ausgeführt.
32WIS – SS 2020 - Teil 4/bash
Zyklische Wiederholungen: cron
� Für cron muss die Maschine permanent laufen, z. B. auf einem Server oder einer Firewall.
� Ansonsten sollte anacron benutzt werden.
� cron ist nur für zyklische Wiederholungen geschaffen.
� Einmaliges sollte nur mit at gemacht werden, da beim Vergessen eines einmaligen cron-Jobs dieser jedes Jahr zum angegebenen Zeitpunkt abläuft, was dann für Überraschungen sorgt.
33WIS – SS 2020 - Teil 4/bash
Aufbau der crontab-Datei I
Min. Std. Tag Monat Wochentag [User] Kommando %Input
� Ist eine Zeitangabe beliebig, wird ein * angegeben. � Hinter einem % steht der Input für das davor stehende
Kommando.� Als Kommando kommen Shell-Files und Kommandos mit
Parametern in Frage.� Der User wird nur in der globalen crontab angegeben.� Am Anfang der Datei können noch globale Environment-
Angaben gemacht werden: Keyword=...
* * * * * Befehl| | | | || | | | || | | | +---- Wochentag (0-7, Sonntag ist 0 oder 7)| | | +------ Monat (1-12)| | +-------- Tag (1-31)| +---------- Stunde (0-23)+------------ Minute (0-59)
34WIS – SS 2020 - Teil 4/bash
Aufbau der crontab-Datei II
SHELL=/bin/shPATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/binMAILTO=root## check scripts in cron.hourly, cron.daily, cron.weekly, and cron.monthly#*/15 * * * * root test -x /usr/lib/cron/run-crons && /usr/lib/cron/run-crons >...59 * * * * root rm -f /var/spool/cron/lastrun/cron.hourly14 0 * * * root rm -f /var/spool/cron/lastrun/cron.daily29 0 * * 6 root rm -f /var/spool/cron/lastrun/cron.weekly44 0 1 * * root rm -f /var/spool/cron/lastrun/cron.monthly
Standard-Versionder globalen crontab: /etc/crontab
Diese Spalte gibt esnur in der globalencron-Tabelle
Min. Std. Tag Monat Wochentag [User] Kommando %Input
Es wird die Existenz einer Datei geprüft undfalls dies zutrifft, der Teil hinter && ausgeführt.
35WIS – SS 2020 - Teil 4/bash
Aufbau der crontab-Datei III
� Gibt es mehrere Werte pro Feld, so können diese durch eine durch Kommata getrennte Liste angegeben werden.Es dürfen keine Blanks eingeschoben werden.
� Sollen Bereiche angegeben werden, so wird ein - benutzt. Die Einheiten entsprechen der Position in der Zeile, z. B. 1. Spalte Minuten etc.Ein * steht für den gesamten Bereich.
� Soll innerhalb eines Bereichs - hier steht ein * für den gesamten Bereich - alle N Einheiten gearbeitet werden, so wird der Zyklus nach einem / angegeben,z.B. bedeutet
*/15 * * * * root test -x /usr.... alle 15 Minuten.
36WIS – SS 2020 - Teil 4/bash
Aufbau der crontab-Datei IV
� Angaben von Monatstag und Wochentag werden mit ODER verknüpftBeispiel:
* * 13 * Fri root wall … Freitag der 13….Ist falsch, da an jedem Freitag und auch an jedem 13. das wall-Kommando (write to all user) ausgeführt wird.
� Es können mehrere Abschnitte mit Environment-Definitionen benutzt werden, wobei die Priorität von vorn nach hinten geht.Beispiel:
MAILTO=root* * * * * root test -x /usr/lib/cron/run-crons && /...MAILTO=postmaster* * * * * root /usr/lib/cron/apache-crons >...
37WIS – SS 2020 - Teil 4/bash
Aufbau der crontab-Datei V
� Kommentare beginnen mit einem # in der 1. Spalte
� Anzahl der crontab-Dateien:– Eine globale: /etc/crontab
– Für jeden Benutzer
� Benutzer (auch root) müssen die Tabelle über das Kommando crontab editieren:– crontab -e
Der Editor wird durch $EDITOR (Default vi) festgelegt
– Dabei wird ein Syntax-Check der Datei durchgeführt.
� Leider entstehen dadurch viele crontab-Dateien, die zur Unübersichtlichkeit führen:
crontab -u Benutzer -l
listet als root die crontab eines des Users Benutzer auf.
� crontab -l zeigt die eigene crontab.
38WIS – SS 2020 - Teil 4/bash
Beschränkung von cron
� Der User root darf alles.
� Existiert die Datei /etc/cron.allow, so dürfen nur die dort aufgeführten Benutzer crontab durchführen.
� Existiert keine solche Datei, wird die Existenz von /etc/cron.deny geprüft; falls vorhanden, dürfen alle Benutzer, deren Namen hier nicht auftauchen, crontab benutzen.
Die Beschränkungen von cron sind:
39WIS – SS 2020 - Teil 4/bash
Nun wieder etwas entspannen...