2019-01-02 15:04:16 +01:00
<!doctype html>
< html lang = "de" >
< meta charset = "utf-8" >
< title > Einführung in Linux< / title >
< meta name = "description" content = "YALC - Yet Another Linux Course " >
< meta name = "author" content = "Daniel Schubert" >
< meta name = "apple-mobile-web-app-capable" content = "yes" >
< meta name = "apple-mobile-web-app-status-bar-style" content = "black-translucent" >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" >
< link rel = "stylesheet" href = "css/reveal.css" >
< link rel = "stylesheet" href = "css/theme/league.css" id = "theme" >
< link rel = "icon" href = "img/openlogo-nd-25.png" type = "img/png" >
<!-- Theme used for syntax highlighting of code -->
< link rel = "stylesheet" href = "lib/css/zenburn.css" >
<!-- Printing and PDF exports -->
< script >
var link = document.createElement( 'link' );
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = window.location.search.match( /print-pdf/gi ) ? 'css/print/pdf.css' : 'css/print/paper.css';
document.getElementsByTagName( 'head' )[0].appendChild( link );
< / script >
< / head >
< body >
< div class = "reveal" >
<!-- Any section element inside of this container is displayed as a slide -->
< div class = "slides" >
< section data-transition = "slide" data-background = "#4d7e65" data-background-transition = "zoom" >
< h1 > LINUX< / h1 >
< h3 > Das universelle Betriebssystem< / h3 >
2019-01-08 13:08:27 +01:00
< p > Eine Einführung - Teil 5
2019-01-02 15:04:16 +01:00
< p >
< small > Deutsche Angestellten Akademie< / small >
< / p >
< aside class = "notes" >
Frage: Fragen zur letzten Stunde?
2019-01-10 12:09:22 +01:00
< h3 > LINKS< / h3 >
2019-01-08 13:08:27 +01:00
< p > http://tldp.org/LDP/abs/html/complexfunct.html
< p > http://programmingexamples.wikidot.com/bash-scripting#toc24
< div >
- script kontrolle ( strg-z etc )
- input
- parameter
- functions
- kontrollstrukturen
-
2019-01-10 12:09:22 +01:00
< / aside >
< / section >
< section >
< h2 > Bash scripting - Fortsetzung< / h2 >
< h3 > Wiederholung< / h3 >
2019-01-08 13:08:27 +01:00
< / section >
< section >
< h3 > Variablen< / h3 >
< pre > < code > #!/bin/bash
x=10 #NICHT x = 10 -> keine Leerzeichen!
X=20 #variablen sind Case Sensitive
$y= #NULL variable
echo "x = $x"
echo "X = $X"
2019-01-09 11:55:18 +01:00
echo "y = $y"
unset x #variable löschen
echo $x< / code > < / pre >
2019-01-08 13:08:27 +01:00
< / section >
< section >
< h3 > Kommentare< / h3 >
< pre > < code >
#!/bin/bash
# Diese Zeile ist ein Kommentar
echo "A comment will follow." # Comment here.
echo "The # here does not begin a comment."
echo 'The # here does not begin a comment.'
echo The \# here does not begin a comment.
echo The # here begins a comment.
echo ${PATH#*:} # Parameter substitution, not a comment.
echo $(( 2#101011 )) # Base conversion, not a comment.
< / code >
< / pre >
< / section >
< section >
2019-01-09 11:55:18 +01:00
< h3 > Quoting< / h3 >
< ul style = "font-size: .8em " >
< li class = "fragment " > < code > " "< / code > (Anführungszeichen) Alles zwischen diesen Zeichen ist buchstabengetreu zu interpretieren. Ausnahmen :< code > $ ` " \ < / code > < / li >
< li class = "fragment " > < code > ' ' < / code > (Ticks) Alles zwischen diesen Zeichen wird wörtlich genommen, mit Ausnahme eines weiteren < code > '< / code > .< / li >
< li class = "fragment " > < code > \< / code > (Backslash) Das Zeichen nach einem < code > \< / code > wird wörtlich genommen. Anwendung z. B. innerhalb von " ", um ", $ und ` zu entwerten.< / li >
< li class = "fragment " > < code > ` `< / code > (Backticks) Alles innerhalb wird als Kommando interpretiert.< / li >
2019-01-08 13:08:27 +01:00
< / ul >
< / section >
2019-01-09 11:55:18 +01:00
< section >
< pre > < code > $ echo 'Ticks "schützen" Anführungszeichen'
Ticks "schützen" Anführungszeichen
$ echo "Ist dies ein \"Sonderfall\"?"
Ist dies ein "Sonderfall"?
$ echo "Sie haben `ls | wc -l` Dateien in `pwd`"
Sie haben 43 Dateien in /home/dany
$ echo "Der Wert von \$x ist $x"
Der Wert von $x ist 100
# Maskierung der Leerstelle mit \
message="hallo Welt"
message=hello\ Welt
< / code > < / pre >
< / section >
2019-01-10 12:09:22 +01:00
< section > < pre style = "font-size: .5em;width: auto" > < code >
echo 'So sprach'"'"'s und ging ohne einen Backslash (\) weiter.'
└───┬───┘└┬┘└──────────────────┬─────────────────────┘
2019-01-09 11:55:18 +01:00
│ │ │
│ │ └ Dritter Bereich: Wieder
│ │ von ' umschlossen, der
│ │ Backlash verliert
│ │ seine Sonderbedeutung.
│ │
│ └ Zweiter Bereich: Von " umschlossen, enthält ein
│ einzelnes '.
│
└ Erster Bereich: Von ' umschlossen.< / code > < / pre > < / section >
2019-01-08 13:08:27 +01:00
< section >
< h3 > Input - Output redirection< / h3 >
< pre > < code > #!/bin/bash
2019-01-09 11:55:18 +01:00
# > : output in Datei. Best. Datei wird überschrieben!
2019-01-08 13:08:27 +01:00
ls > file_list
2019-01-09 11:55:18 +01:00
# >> : output an Datei anhängen.
2019-01-08 13:08:27 +01:00
ls -la >> file_list
2019-01-09 11:55:18 +01:00
# < : Kommando Input aus Datei lesen
2019-01-08 13:08:27 +01:00
cat < file_list < / code > < / pre >
< / section >
< section >
2019-01-09 11:55:18 +01:00
Man kann Kommandos auch verkettten:
< table style = "font-size: .5em" >
< tbody >
< tr >
< td > Kommando1; Kommando2
< / td >
< td > fühert die Kommandos hintereinander aus
< / td >
< / tr >
< tr >
< td > Kommando1 & & Kommando2
< / td >
< td > führt Kommando2 aus, wenn kommando1 erfolgreich war
< / td >
< / tr >
< tr >
< td > Kommando1 || Kommando2
< / td >
< td > führt Kommando2 aus, wenn kommando1 NICHT erfolgreich war
< / td >
< / tr >
< tr >
< td > Kommado &
< / td >
< td > Führt Kommando im Hintergrund aus
< / td >
< / tr >
< tr >
< td > Kommando1 & Kommando2
< / td >
< td > startet Kommando1 im Hintergrund, Kommando2 im Vordergrund
< / td >
< / tr >
< tr >
< td > ( Kommando1; Kommando2 )
< / td >
< td > Führt die beiden K. nacheinander in einer Subshell aus
< / td >
< / tr >
< / tbody >
< / table >
< pre class = "fragment" > < code > sudo apt-get update & & sudo apt-get upgrade -y
tar cf archiv.tar & & rm *.doc || echo "fehler"< / code > < / pre >
< / section >
< section >
< span style = "color: orange" > Aufgabe:< / span > Erstellt ein script, das den Inhalt eures home in eine Variable < code > liste< / code > schreibt, und gebt den Inhalt dieser Variablen in eine Textdatei < code > liste.txt< / code > aus.< br / >
Hinweis: ls , tee
< pre class = "fragment" > < code > #!/bin/bash
OUTFILE="liste.txt"
2019-01-10 12:09:22 +01:00
liste=`ls`
echo $liste > $OUTFILE
2019-01-09 11:55:18 +01:00
2019-01-10 12:09:22 +01:00
#mit tee in einer Zeile
liste=`ls | tee $OUTFILE`
2019-01-09 11:55:18 +01:00
cat $OUTFILE
< / code > < / pre >
< / section >
< section >
< h3 > exit status< / h3 >
< pre > < code > exit 0< / code > < / pre >
heisst : alles gut gelaufen
< pre > < code > exit 1< / code > < / pre >
heisst : kommando fehlgeschlagen
< p > der exit code in scripten kann beliebig gesetzt werden
< p > Standard: exit 0 -> alles fein
< / section >
< section >
< h3 > Funktionen< / h3 >
< pre > < code > #!/bin/bash
#Funktions Deklaration:
count () {
ls | wc -l
2019-01-08 13:08:27 +01:00
2019-01-09 11:55:18 +01:00
# ls: Liste aller Objekte im Verzeichnis
# wc: Word-Count; mit Attribut -l werden Zeilen gezählt
2019-01-10 12:09:22 +01:00
# in Verbindung mit ls werden also die
# (nicht versteckten) Objekte gezählt
2019-01-09 11:55:18 +01:00
}
2019-01-08 13:08:27 +01:00
2019-01-09 11:55:18 +01:00
count # Aufruf der Funktion
< / code > < / pre >
< / section >
2019-01-10 12:09:22 +01:00
< section >
< pre > < code > #!/bin/sh
fatal() {
msg=$1
echo "Fatal: $msg"
exit 1
}
[ -d /tmp ] || fatal "Verzeichnis /tmp existiert nicht"
[ -w /tmp ] || fatal "Verzeichnis /tmp nicht schreibbar"
TMP=/tmp/mydir
[ -d $TMP ] || mkdir $TMP # tmp-Verz. erzeugen, wenn noch nicht vorhanden
< / code > < / pre >
< / section >
2019-01-09 11:55:18 +01:00
< section >
< pre > < code > #!/bin/bash
count2 () {
# überprüfen, ob der erste Parameter ein Verzeichnis ist
if [ -d "$1" ]; then
ls $1 | wc -l
exit 0 # alles OK
else
echo "Ungültiges Verzeichnis: $1"
exit 1 # Fehler
fi
}
count2 "/gibt/es/garnicht" # Aufrufe der Funktion count2
echo "Status: $?"
2019-01-08 13:08:27 +01:00
2019-01-09 11:55:18 +01:00
count2 "/etc"
echo "Status: $?"< / code > < / pre >
< / section >
2019-01-10 12:09:22 +01:00
< section style = "font-size: .8em" >
< span style = "color: orange" > Aufgabe:< / span > Erstellt script mit mind einer Funktion das:
< ul >
< li > ein Backup eines Verzeichnisses erstellt< / li >
< li > per Parameter den namen des Quell-Verzeichnis erhält< / li >
< li > per Parameter den Namen der Zieldatei erhält< / li >
< li > einen nützlichen exit code setzt< / li >
< li > vielleicht nützliche Meldungen ausgibt< / li >
< / ul >
< div > < p > Tipps:< / p >
< ul >
< li > Parameter Übergabe: kommando param1 param2< / li >
< li > Parameter Übernahme: param1 = $1 , param2 = $2 etc< / li >
< / ul >
< / div >
< / section >
< section style = "font-size: .8em" >
< pre > < code > #!/bin/bash
function file_backup {
echo 'Backup --- building tar File...'
tar -czf $2 $1 || fail "Fehler beim Archiv erstellen"
echo '+DONE'
exit 0
}
2019-01-09 11:55:18 +01:00
2019-01-10 12:09:22 +01:00
fail () {
echo "Fehler! + $1"
exit 1
}
2019-01-09 11:55:18 +01:00
2019-01-10 12:09:22 +01:00
#function call
# file_backup 'backup-quelle' 'backup-ziel.tar.gz'
file_backup $1 $2
2019-01-09 11:55:18 +01:00
2019-01-10 12:09:22 +01:00
< / code > < / pre >
< aside class = "notes" >
hinzufügen überprüfung ob quelle verz. < br >
überprüfung ob ziel existiert < br >
überpr. ob ziel angelegt < br >
überprüf ob param vorhanden < br >
backup verz anlegen
< / aside >
< / section >
2019-01-09 11:55:18 +01:00
< section >
< pre > < code >
Integer Berechnungen
let "m = 4 * 1024";echo $m
let "m += 15"
let "m -= 3"
let "m /= 5"
let "m %= 10"
let "m++"
let "m--"
< / code > < / pre >
2019-01-10 12:09:22 +01:00
2019-01-09 11:55:18 +01:00
< pre > < code >
2019-01-10 12:09:22 +01:00
Floating Point:
2019-01-09 11:55:18 +01:00
echo "32.0 + 1.4" | bc
echo `expr $m + 18`
m=`expr $m + 18`
(( m *= 4 ))
< / code > < / pre >
2019-01-08 13:08:27 +01:00
< / section >
2019-01-10 12:09:22 +01:00
< section > ternary operator
< pre > < code > let "k = (m < 9 ) ? 0 : 1 "
condition ? value-if-true : value-if-false< / code > < / pre > < / section >
2019-01-02 15:04:16 +01:00
< section data-transition = "slide" data-background = "#4d7e65" data-background-transition = "zoom" >
2019-01-10 12:09:22 +01:00
< h3 > Maus ist voll 90er !!< / h3 >
< a href = "https://github.com/agarrharr/awesome-cli-apps" > https://github.com/agarrharr/awesome-cli-apps< / a >
< a href = "https://github.com/alebcay/awesome-shell" > https://github.com/alebcay/awesome-shell< / a >
2019-01-02 15:04:16 +01:00
< / section >
2019-01-08 13:08:27 +01:00
2019-01-09 11:55:18 +01:00
2019-01-02 15:04:16 +01:00
< / div >
< / div >
< script src = "lib/js/head.min.js" > < / script >
< script src = "js/reveal.js" > < / script >
< script >
// More info https://github.com/hakimel/reveal.js#configuration
Reveal.initialize({
controls: true,
progress: true,
history: true,
center: true,
transition: 'slide', // none/fade/slide/convex/concave/zoom
// More info https://github.com/hakimel/reveal.js#dependencies
dependencies: [
{ src: 'lib/js/classList.js', condition: function() { return !document.body.classList; } },
{ src: 'plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
{ src: 'plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
{ src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
{ src: 'plugin/search/search.js', async: true },
{ src: 'plugin/zoom-js/zoom.js', async: true },
{ src: 'plugin/notes/notes.js', async: true }
]
});
< / script >
< / body >
< / html >