Bash-Advanced

2022-04-11

Marcus Ganske - Fachschaft Informatik

Was wir machen

  • Variablen
  • Conditionals
  • Schleifen
  • Bash-Skripting
  • bisschen anderen fancy shit

Was ihr schon wissen solltet

  • Navigation
  • Datei anlegen/löschen/umbenennen
  • Dateiinhalt ausgeben
  • Ein-/Ausgabeumlenkung
  • Suchen, Bytes zählen, sortieren und ausschneiden
  • Zugriffsrechte
  • Hilfe bekommen
  • Archive
  • Prozesse
  • inode
  • Aliasing
  • Quoting

Also ich kann jetzt in der Bash-Wildnis überleben. Zeit, es sich gemütlich einzurichten

Variablen

$ a="10"

$ x="foo"

  • wie überall, speichern einen Wert
  • typlos
  • deklarieren nicht notwendig, wird beim Wert zuweisen erstellt
  • OBACHT Variable lebt nur in der aktuellen Shell

Ausgabe mit echo, Zugriff auf eine Variable mit $

$ echo $x

Systemvariablen sind in CAPSLOCK geschrieben. Beispiele:

  • $HOME - zeigt auf das Heimverzeichnis des aktuellen Benutzis
  • $EDITOR - Standardeditor; normalerweise vim oder emacs
  • $PATH - Pfadvariable zu den Binaries; normalerweise sowas wie /usr/bin, /.local/bin
    • mehrere Pfade werden mit : getrennt, Bsp: /usr/bin:/usr/local/bin

Positionsvariablen

  • $0, $1, $2, etc. - werden von der Commandline an das Skript oder eine Funktion übergeben
  • $# - Anzahl der übergebenen Argumente
  • $* - Alle übergebenen Argumente als ein einziges Wort
  • $@ - Alle übergebenen Argumente als einzelne Wörter

Bash-Scripting

Was ist ein Bash Script?

  • Eine Datei, die Bash Befehle enthält. Ein Skript wird zeilenweise gelesen und ausgeführt.
  • Ein Bash Script hat die Endung .sh
  • Ein Bash Script beginnt mit dem sog. "Shebang": #!/bin/sh oder #!/bin/bash
#!/bin/bash
echo "Hello World!"

Conditionals

  • if Statement
    • verschachtelte if
  • Eingabe und Dateien vergleichen und testen
  • if/then/else Konstrukte
    • if/then/elif/else Konstrukte
  • Positionsparameter benutzen und darauf testen
  • Boole'sche Ausdrücke
  • case Statement

if Statement

Wie überall, zum Entscheidungen treffen

if TEST-COMMANDS; then CONSEQUENT-COMMANDS; fi

Liste von TEST-COMMANDS auf der nächsten Folie

CONSEQUENT-COMMANDS kann jeder korrekte Unixbefehl sein, ein ausführbares Programm, ein Shellskript oder ein Shellbefehl. Deshalb muss in der Shell mit ; getrennt werden.

Beispiel: if [ $a -eq 10 ]; then echo "aye"; fi oder if test $a -eq 10; then echo "aye"; fi

File Conditionals

Expression Value What does it do?
-b file If file exists and is a block special file.
-c file If file exists and is a character special file.
-d file If file exists and is a directory.
-e file If file exists.
-f file If file exists and is a regular file.
-g file If file exists and its set-group-id bit is set.
-h file If file exists and is a symbolic link.
-p file If file exists and is a named pipe (FIFO).
-r file If file exists and is readable.
-s file If file exists and its size is greater than zero.
-t fd If file descriptor is open and refers to a terminal.
-u file If file exists and its set-user-id bit is set.
-w file If file exists and is writable.
-x file If file exists and is executable.
-L file If file exists and is a symbolic link.
-S file If file exists and is a socket.

Variable Conditionals

Expression Value What does it do?
-z var If the length of string is zero.
-n var If the length of string is non-zero.

Variable Comparisons

Expression What does it do?
var = var2 Equal to.
var != var2 Not equal to.
var -eq var2 Equal to (algebraically).
var -ne var2 Not equal to (algebraically).
var -gt var2 Greater than (algebraically).
var -ge var2 Greater than or equal to (algebraically).
var -lt var2 Less than (algebraically).
var -le var2 Less than or equal to (algebraically).

if/then/elif/else Konstrukte

if TEST-COMMANDS;
then CONSEQUENT-COMMANDS;
elif MORE-TEST-COMMANDS; then
MORE-CONSEQUENT-COMMANDS;
else ALTERNATE-CONSEQUENT-COMMANDS;
fi
#!/bin/bash
# This script will test if we're in a leap year or not.

year=`date +%Y`

if [ $[$year % 400] -eq "0" ]; then
    echo "This is a leap year.  February has 29 days."
elif [ $[$year % 4] -eq 0 ]; then
    if [ $[$year % 100] -ne 0 ]; then
        echo "This is a leap year, February has 29 days."
    else
        echo "This is not a leap year.  February has 28 days."
    fi
else
    echo "This is not a leap year.  February has 28 days."
fi

Boole'sche Ausdrücke

Operators What does it do?
! NOT
&& AND
|| OR

case Statement

für mehr als zwei Auswahlmöglichkeiten

case EXPRESSION in 
    CASE1) COMMAND-LIST;; 
    CASE2) COMMAND-LIST;; 
    ...
    CASEN) COMMAND-LIST;;
esac

Übung

Aufgabe 1

Erstellt ein Skript, dem eine Dateinamen als Parameter übergeben werden kann. Falls die Datei existiert und lesbar ist, bietet das Skript eine Auswahl an Aktionen zur angegebenen Datei an. Im einzelnen soll es den Dateiinhalt, den Dateityp, die Dateieigenschaften oder die Dateigröße anzeigen können. Bei einer ungültigen Auswahl soll eine Fehlermeldung ausgegeben werden.

Hinweis: Eingabe kriegt ihr mit read <Variablenname> hin

Schleifen

für sich wiederholende Aufgaben - wie immer

Es gibt drei Schleifen:

  • for
  • while
  • until

for-Schleife

for arg in [list]
do
 command(s)...
done

Beispiel: for i in 1 2 3 4 5; do echo "$i"; done

while-Schleife

while [ condition ]
do
 command(s)...
done

Beispiel:

i = 1
while [ "$i" -le "10" ]; do 
    echo "$i"; let "i+=1";
done

until-Schleife

until [ condition-is-true ]
do
 command(s)...
done

Beispiel:

i = 10
until [ "$i" -eq "0" ]; do
    echo "$i"; let "i-=1";
done

break und continue

  • break bricht sofort aus der Schleife aus
  • continue macht direkt mit der nächten Iteration weiter

Übung

Aufgabe 2

Schreibt ein kleines Ratespiel, bei dem das Benutzi eine Zahl zwischen 0 und 10 erraten soll. Es hat hierfür unendlich viele Versuche. Das Skript soll es nach Fehlversuchen unterstützen, indem es eine Ausgabe mit „Geheime Zahl ist größer“ oder „Geheime Zahl ist kleiner“ macht. Wenn das Benutzi richtig getippt hat, wird ihm gratuliert und das Skript beendet sich.

Hilfestellung: Eine Zufallszahl „zahl“ zwischen 0 und 10 kann folgendermaßen erzeugt werden: zahl=$(expr $RANDOM % 11)

Zusatzaufgabe: Schreibt eine Variante mit begrenzt vielen Rateversuchen.

Positionsparameter

fancy Shit

Escape Sequenzen

Die Shell kann auch farbigen Text darstellen

Syntax ist \e[[<Textattribut>;]<Vordergrund>;<Hintergrund>m<angezeigter Text> oder

\e[[<Textattribut>;]38;2;<R_FG>;<G_FG>;<B_FG>;<48;2;<R_BG>;<G_BG>;<B_BG>m<angezeigter Text>

Textfarben

Color Foreground Background
black 30 40
red 31 41
green 32 42
yellow 33 43
blue 34 44
magenta 35 45
cyan 36 46
white 37 47

Text Attributes

Sequence What does it do?
\033[m Reset text formatting and colors.
\033[1m Bold text.
\033[2m Faint text.
\033[3m Italic text.
\033[4m Underline text.
\033[5m Slow blink.
\033[7m Swap foreground and background colors.
\033[8m Hidden text.
\033[9m Strike-through text.