441 lines
12 KiB
HTML
441 lines
12 KiB
HTML
<!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>
|
|
<p>Eine Einführung - Teil 5
|
|
<p>
|
|
<small>Deutsche Angestellten Akademie</small>
|
|
</p>
|
|
|
|
<aside class="notes">
|
|
Frage: Fragen zur letzten Stunde?
|
|
|
|
<h3>LINKS</h3>
|
|
|
|
<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
|
|
-
|
|
|
|
</aside>
|
|
</section>
|
|
|
|
<section>
|
|
<h2>Bash scripting - Fortsetzung</h2>
|
|
<h3>Wiederholung</h3>
|
|
</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"
|
|
echo "y = $y"
|
|
unset x #variable löschen
|
|
echo $x</code></pre>
|
|
</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>
|
|
<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>
|
|
</ul>
|
|
</section>
|
|
|
|
<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>
|
|
<section><pre style="font-size: .5em;width: auto">
|
|
echo 'So sprach'"'"'s und ging ohne einen Backslash (\) weiter.'
|
|
└───┬───┘└┬┘└──────────────────┬─────────────────────┘
|
|
│ │ │
|
|
│ │ └ Dritter Bereich: Wieder
|
|
│ │ von ' umschlossen, der
|
|
│ │ Backlash verliert
|
|
│ │ seine Sonderbedeutung.
|
|
│ │
|
|
│ └ Zweiter Bereich: Von " umschlossen, enthält ein
|
|
│ einzelnes '.
|
|
│
|
|
└ Erster Bereich: Von ' umschlossen.</pre></section>
|
|
|
|
<section>
|
|
<h3>Input - Output redirection</h3>
|
|
|
|
<pre><code>#!/bin/bash
|
|
# > : output in Datei. Best. Datei wird überschrieben!
|
|
ls > file_list
|
|
|
|
# >> : output an Datei anhängen.
|
|
ls -la >> file_list
|
|
|
|
# < : Kommando Input aus Datei lesen
|
|
cat < file_list</code></pre>
|
|
</section>
|
|
<section>
|
|
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"
|
|
|
|
liste=`ls`
|
|
echo $liste > $OUTFILE
|
|
|
|
#mit tee in einer Zeile
|
|
liste=`ls | tee $OUTFILE`
|
|
|
|
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
|
|
|
|
# ls: Liste aller Objekte im Verzeichnis
|
|
# wc: Word-Count; mit Attribut -l werden Zeilen gezählt
|
|
# in Verbindung mit ls werden also die
|
|
# (nicht versteckten) Objekte gezählt
|
|
}
|
|
|
|
count # Aufruf der Funktion
|
|
</code></pre>
|
|
</section>
|
|
<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>
|
|
<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: $?"
|
|
|
|
count2 "/etc"
|
|
echo "Status: $?"</code></pre>
|
|
</section>
|
|
|
|
<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
|
|
}
|
|
|
|
fail () {
|
|
echo "Fehler! + $1"
|
|
exit 1
|
|
}
|
|
|
|
#function call
|
|
# file_backup 'backup-quelle' 'backup-ziel.tar.gz'
|
|
file_backup $1 $2
|
|
|
|
</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>
|
|
<section>
|
|
<h4>Script Kontrolle</h4>
|
|
<ul>
|
|
<li class="fragment">CTRL + C - Abbbruch</li>
|
|
<li class="fragment">CTRL + Z - Pausieren</li>
|
|
<li class="fragment"><code>fg</code> - Fortsetzen</li>
|
|
<li class="fragment"><code>bg</code> - im Hintergrund Fortsetzen</li>
|
|
<li class="fragment">CTRL + D - Eingabe beenden</li>
|
|
</ul>
|
|
</section>
|
|
<section>
|
|
<h4>Job Control</h4>
|
|
|
|
<pre><code>
|
|
#!/bin/bash
|
|
find / -name *lib* 2>/dev/null > libs.txt
|
|
|
|
# CTRL - Z
|
|
|
|
jobs
|
|
|
|
fg
|
|
|
|
# CTRL - Z
|
|
|
|
bg
|
|
</code></pre>
|
|
<aside class="notes">
|
|
cat > test.txt<br>
|
|
dd<br>
|
|
ff<br>
|
|
gg<br>
|
|
CTRL - D
|
|
</aside>
|
|
</section>
|
|
|
|
<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>
|
|
|
|
|
|
|
|
<pre><code>
|
|
Floating Point:
|
|
echo "32.0 + 1.4" | bc
|
|
|
|
echo `expr $m + 18`
|
|
m=`expr $m + 18`
|
|
|
|
(( m *= 4 ))
|
|
</code></pre>
|
|
</section>
|
|
<section>ternary operator
|
|
<pre><code>let "k = (m < 9) ? 0 : 1"
|
|
condition ? value-if-true : value-if-false</code></pre></section>
|
|
<section data-transition="slide" data-background="#4d7e65" data-background-transition="zoom">
|
|
<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>
|
|
</section>
|
|
|
|
|
|
|
|
|
|
</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>
|