Zum Inhalt springen

Shellscript

▻

Ein Shellscript fasst im einfachsten Fall ein paar Befehle zusammen, die man öfter mal ausführen muss.

Hier die wichtigsten Tipps für Shellscripts:

▻

Ein Shellscript beginnt mit der magischen ersten Zeile. Achtung: davor kann nichts anderes sein, nicht einmal Kommentar.

#!/usr/bin/bash
# hier kann ein Kommentar sein, das ist ok
echo "Hallo Welt"

Die Ausgabe erfolgt mit echo.

Mit den passenden Zugriffsrechte

Terminal-Fenster
chmod +x meinscript

kann man das Skript starten

Terminal-Fenster
./meinscript
▻

Wenn man eine Variable setzt hat sie kein Dollar-Zeichen, wenn man sie verwendet hat sie ein Dollar-Zeichen

Terminal-Fenster
NAME="Brigitte"
echo "Hallo $NAME"
▻

sieht ähnlich aber anders aus als in c: die Bedingung ist in eckigen klammern und verwendet operatoren die immer mit Minus beginnen.

Hier -lt für “less than”:

Terminal-Fenster
if [ $ALTER -lt 18 ]; then
echo "Du kommst hier nicht rein"
else
echo "Willkommen im Club"
fi

Weitere Operatoren:

- `=` ein Gleichzeichen für Vergleich von Strings
- `-eq` für "equal" bei Zahlen
- `-ne` für "not equal" bei Zahlen
- `-gt` für "greater than" bei Zahlen
- `-ge` für "greater or equal" bei Zahlen
- `-lt` für "less than" bei Zahlen
- `-le` für "less or equal" bei Zahlen

Und weitere Tests:

- `-f name` für "existiert eine Datei diesen Namens?"
- `-d name` für "existiert ein Ordner diesen Namens?"

Boolsche Operatoren

- `!` für Verneinung
- `&&` für und
- `||` für oder

Beispiel für Boolsche Operatoren

Terminal-Fenster
if [ $ALTER -ge 18 ] && [ $ALTER -lt 24 ]; then
echo "In den USA darfst du noch keinen Alkohol trinken"
fi
▻
Terminal-Fenster
for SIZE in 350 740 1400 2800
do
echo "Ich soll davon eine Bild mit Breite $SIZE erzeugen"
done
▻

Wird das Programm mit Argumenten aufgerufen, so landen diese als Strings in den Variablen $1 $2 usw.

Terminal-Fenster
./meinscript arg1 -f

hier wäre also $1 gleich “arg1” und $2 gleich “-f”

Die Anzahl der Argument landet in der Variable $#

Eine Schleife über die Argumente:

Terminal-Fenster
for ARG in $@
do
echo "Noch ein Argument: $ARG"
done
▻

Man kann die Ausgabe in eine Datei umleiten mit >, das überschreibt die Datei. Oder man kann mit >> an die Datei anfügen:

Terminal-Fenster
echo "Hallo Welt" > README.md
echo "nochwas,...." >> README.md
▻

Die bash bietet viele Möglichkeiten beim Aufruf einer Variable gleich noch eine Berechnung zu machen:

Terminal-Fenster
SPRUCH="Mit Linux wäre das nicht passiert"
echo $SPRUCH
echo ${SPRUCH/Linux/Mac}

Die Ausgabe lautet

Terminal-Fenster
Mit Linux wäre das nicht passiert
Mit Mac wäre das nicht passiert

Mehr Tricks im Advanced Bash Scripting Guide

▻

Meine Konfiguration für Bash in der Datei ~/.bashrc

Abschnitt betitelt „Meine Konfiguration für Bash in der Datei ~/.bashrc“

Falls es in meinem Homeverzeichnis eine Datei .bashrc gibt, dann wird die immer ausgeführt wenn ich eine neue Bash-Session starte.

Also z.B. wenn ich das git-bash Fenster aufmache.

In dieser Datei kann man zum Beispiel Umgebung-Variablen setzen, die immer gelten sollen:

Terminal-Fenster
export SPRUCH="Mit Linux wäre das nicht passiert."

Dann kann ich die Varialbe $SPRUCH auf der Kommandozeile und in allen Shell-Skripts nutzen, sie ist schon da.

▻

Skripte die man oft braucht kann man in einem eigenen Ordner ablegen. Auf Linux und Mac wäre der typische Ort dafür der Order bin im eigenen Home-Verzeichnis.

Diesen Ordner gibt man in die PATH Variable.

z.B. indem man in der Datei ~/.bash_profile einen entsprechenen Eintrag macht:

Terminal-Fenster
export PATH="$PATH:/home/bjelline/bin"

hier wird die PATH Variable neu gesetzt, und zwar auf den schon vorhandnen Wert plus den Pfad zum bin-Ordner in meinem Home-Verzeichnis.

Wenn die Pfad-Variable so getzt ist, kann ich Skripts aus meinem bin-Ordner von überall aus aufrufen.

Wenn in meinem bin Ordner die Skripte mkalgodatproject und mksizes liegen kann ich sie so verwenden, egal “wo” ich bin:

Terminal-Fenster
cd ~/dev/studium/Jellinek_Brigitte_algodat
mkalgodatproject 5 1
cd ~/dev/studium/Jellinke_Brigitte_wp2/pizza
mksizes pizza.jpg
▻