Lektion 1 von 9
Erste Schritte in der Shell
Du kennst PowerShell, Bash und Python als Werkzeuge, verstehst den Unterschied zwischen Objekt- und Text-Pipeline und schreibst dein erstes Skript in allen drei Sprachen.
Worum es geht
Es ist 7.10 Uhr bei der Sanitär Keller AG in Wil SG. Lea, ICT-Fachfrau im 2. Lehrjahr, sitzt vor vier Fenstern: Sie hat sich per Remotedesktop auf jeden der vier Server verbunden, klickt sich zu «Dieser PC» durch und schaut, ob die Laufwerke genug Platz haben. Danach öffnet sie den Backup-Bericht des NAS und schreibt ins Teams: «Alles ok.» Das dauert jeden Morgen 25 Minuten. An Tagen, an denen das Telefon schon um 7 Uhr klingelt, fällt die Kontrolle aus. Genau an einem solchen Tag läuft dann natürlich ein Laufwerk voll.
Ein Computer ist für solche Arbeit wie gemacht: Er wird nicht müde, vergisst keinen Server und vertippt sich nie. Du musst ihm nur genau sagen, was er tun soll. Das tust du mit einem Skript. In diesem Kurs lernst du, wiederkehrende Abläufe aus dem ICT-Alltag in Skripte zu übersetzen: Dateien aufräumen, Logfiles auswerten, Berichte erzeugen, Benutzer anlegen. Du arbeitest mit drei Sprachen, die dir im Betrieb täglich begegnen: PowerShell für Windows, Bash für Linux und Python für Datenaufgaben.
In dieser ersten Lektion lernst du die Kommandozeile als Werkzeug kennen, verstehst den wichtigsten Unterschied zwischen PowerShell und Bash und schreibst dein erstes Skript, und zwar gleich in allen drei Sprachen.
Shell, Terminal, Skript: die Begriffe
Bevor du loslegst, lohnt es sich, ein paar Begriffe sauber auseinanderzuhalten. Sie werden im Alltag oft durcheinander verwendet.
- Das Terminal ist das Fenster, in dem du tippst, zum Beispiel Windows Terminal oder das Terminal in Visual Studio Code.
- Die Shell ist das Programm, das deine Eingaben liest, versteht und ausführt. Unter Windows ist das PowerShell, unter Linux meistens Bash. Die Shell ist wie eine Dolmetscherin zwischen dir und dem Betriebssystem.
- Ein Skript ist eine Textdatei mit Befehlen, die ein Interpreter von oben nach unten ausführt. Anders als bei Java oder C# wird nichts vorher kompiliert: Du speicherst die Datei und startest sie.
Unter Windows gibt es zwei PowerShell-Varianten. Windows PowerShell 5.1 (powershell.exe) ist vorinstalliert, wird aber nicht mehr weiterentwickelt. PowerShell 7 (pwsh.exe) ist die aktuelle Version, läuft auch auf Linux und macOS und ist die Variante, mit der du in diesem Kurs arbeitest. Bash bekommst du unter Windows über das Windows-Subsystem für Linux (WSL) oder Git Bash, auf jedem Linux-Server ist sie sowieso da.
| PowerShell 7 | Bash | Python 3 | |
|---|---|---|---|
| Zuhause | Windows, Microsoft 365, Active Directory | Linux-Server, Container, Netzwerkgeräte | überall, Daten und Schnittstellen |
| Datei-Endung | .ps1 | .sh | .py |
| Was durch die Pipeline fliesst | Objekte | Text | (keine Shell-Pipeline, eigene Datenstrukturen) |
| Typischer Auftrag | Benutzer anlegen, Server prüfen | Logfiles auswerten, Backups per cron | CSV und JSON verarbeiten, Web-APIs abfragen |
| Skript starten | .\info.ps1 | ./info.sh | python info.py |
Die ersten Befehle: Explorer-Aktionen als Text
Alles, was du im Explorer mit der Maus machst, geht auch als Befehl. PowerShell-Befehle heissen Cmdlets und folgen immer dem Muster Verb-Nomen: Get-ChildItem (hole die Kindelemente eines Ordners), New-Item (lege ein neues Element an), Copy-Item (kopiere ein Element). Das Verb sagt, was passiert, das Nomen, womit. Bash-Befehle sind kürzer und älter, dafür weniger sprechend.
| Aktion | PowerShell | Bash |
|---|---|---|
| Wo bin ich? | Get-Location | pwd |
| Ordner wechseln | Set-Location C:\Skripte | cd ~/skripte |
| Inhalt anzeigen | Get-ChildItem | ls -l |
| Ordner anlegen | New-Item -ItemType Directory -Path Test | mkdir test |
| Datei kopieren | Copy-Item a.txt b.txt | cp a.txt b.txt |
| Datei verschieben | Move-Item a.txt Archiv\ | mv a.txt archiv/ |
| Datei löschen | Remove-Item a.txt | rm a.txt |
| Datei anzeigen | Get-Content log.txt | cat log.txt |
| Text suchen | Select-String -Pattern Fehler -Path log.txt | grep Fehler log.txt |
| Hilfe | Get-Help Copy-Item -Examples | man cp |
Damit Umsteiger sich zu Hause fühlen, kennt PowerShell unter Windows Aliase: ls, dir, cd, cat funktionieren auch. Hinter ls steckt dann aber Get-ChildItem. In Skripten schreibst du immer den vollen Namen: Er ist eindeutig, besser lesbar und funktioniert auf jedem System gleich.
Ordne jedem Bash-Befehl das PowerShell-Cmdlet zu, das dieselbe Aufgabe erledigt.
Objekte und Text: der wichtigste Unterschied
Hier liegt der grösste Unterschied zwischen PowerShell und Bash, und er wird dich durch den ganzen Kurs begleiten. Beide Shells kennen die Pipeline: Mit dem Zeichen | gibst du die Ausgabe eines Befehls an den nächsten weiter. Was dabei weitergereicht wird, ist aber grundverschieden.
Stell dir zwei Büros vor. Im ersten Büro reicht man sich ausgefüllte Formulare weiter: Jedes Feld hat eine Beschriftung, «Name», «Grösse», «Änderungsdatum». Wer das Formular bekommt, liest einfach das Feld «Grösse». Im zweiten Büro reicht man sich beschriebene Zettel weiter. Wer die Grösse will, muss wissen, dass sie «in der fünften Spalte» steht, und sie herausschneiden. Ändert jemand das Layout des Zettels, schneidet man an der falschen Stelle.
PowerShell ist das Formular-Büro. Diese Zeile zeigt die drei grössten Dateien eines Ordners:
Get-ChildItem -Path C:\Temp -File |
Sort-Object -Property Length -Descending |
Select-Object -Property Name, Length -First 3Sort-Object sortiert nach der Eigenschaft Length. Es muss nicht wissen, wo die Grösse auf dem Bildschirm stand, und es sortiert als Zahl, nicht als Text.
Bash ist das Zettel-Büro. Dieselbe Aufgabe:
ls -l /tmp | sort -k5 -n -r | head -n 3sort -k5 -n heisst: «Sortiere nach der fünften Spalte, als Zahl.» Das funktioniert, solange ls -l die Grösse wirklich in Spalte 5 ausgibt. Bash ist trotzdem extrem stark: Logfiles sind nun einmal Text, und für Text gibt es kaum bessere Werkzeuge als grep, sort und uniq.
Python hat keine Shell-Pipeline in diesem Sinn. Dort arbeitest du mit eigenen Datenstrukturen wie Listen und Dictionaries und verbindest die Schritte mit Funktionen. Das macht Python ideal für Daten, die nicht aus der Shell kommen, etwa eine CSV-Datei der Buchhaltung oder die Antwort einer Web-API.
Warum sortiert Get-ChildItem | Sort-Object Length in PowerShell zuverlässig nach Dateigrösse, während ls -l | sort -k5 -n in Bash davon abhängt, in welcher Spalte die Grösse steht?
Schritt für Schritt: Dein erstes Skript in drei Sprachen
Lea beginnt klein: Ein Skript soll Computername, angemeldeten Benutzer und freien Speicher auf dem Systemlaufwerk in einer Zeile ausgeben. Das ist ein Baustein der Morgenkontrolle. Mach es parallel auf deinem Rechner mit.
Schritt 1: Arbeitsumgebung einrichten. Installiere PowerShell 7 und Visual Studio Code mit den Erweiterungen «PowerShell» und «Python». Lege einen Ordner an, z.B. C:\Skripte (Windows) oder ~/skripte (Linux), und öffne ihn in VS Code. Im eingebauten Terminal (Menü «Terminal», dann «Neues Terminal») kannst du direkt testen.
Schritt 2: Die PowerShell-Version. Erstelle die Datei info.ps1:
# info.ps1: zeigt Computer, Benutzer und freien Speicher auf C:
$computer = $env:COMPUTERNAME # Umgebungsvariable mit dem Computernamen
$benutzer = $env:USERNAME # angemeldeter Benutzer
$laufwerk = Get-PSDrive -Name C # Objekt mit den Eigenschaften Used und Free (in Bytes)
$freiGB = [math]::Round($laufwerk.Free / 1GB, 1) # 1GB ist in PowerShell eine Zahl: 1073741824
Write-Output "$computer | $benutzer | $freiGB GB frei"Schritt 3: Starten. Im Terminal tippst du .\info.ps1. Der Punkt mit Backslash ist Absicht: PowerShell führt Skripte aus dem aktuellen Ordner aus Sicherheitsgründen nur aus, wenn du den Pfad ausdrücklich angibst. Die Ausgabe sieht etwa so aus:
PC-LEA01 | lea.meier | 112.4 GB freiKommt stattdessen die Meldung, dass die Ausführung von Skripts auf diesem System deaktiviert ist, greift die Execution Policy. Auf Windows-Clients steht sie standardmässig auf Restricted. Mit Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned erlaubst du für deinen Benutzer lokale Skripte, heruntergeladene müssen signiert sein. Mehr dazu in Lektion 9.
Schritt 4: Die Bash-Version. Auf einem Linux-Server oder in WSL erstellst du info.sh:
#!/usr/bin/env bash
# info.sh: zeigt Rechner, Benutzer und freien Speicher auf /
rechner=$(hostname) # Ausgabe eines Befehls in eine Variable
benutzer=$(whoami)
frei=$(df -h --output=avail / | tail -n 1 | tr -d ' ') # nur die Zahl aus der letzten Zeile
echo "$rechner | $benutzer | $frei frei"Die erste Zeile, der Shebang, sagt dem System, welcher Interpreter das Skript ausführt. Dann machst du die Datei ausführbar und startest sie:
chmod +x info.sh
./info.shweb01 | lea | 18G freiAchte darauf, wie Bash den freien Speicher bekommt: df gibt eine Texttabelle aus, tail nimmt die letzte Zeile, tr löscht die Leerzeichen. Das ist das Zettel-Büro in Aktion.
Schritt 5: Die Python-Version. info.py läuft auf beiden Systemen:
# info.py: zeigt Rechner, Benutzer und freien Speicher
import getpass
import platform
import shutil
rechner = platform.node() # Rechnername
benutzer = getpass.getuser() # angemeldeter Benutzer
pfad = "C:\\" if platform.system() == "Windows" else "/" # Systemlaufwerk je nach Betriebssystem
frei_gb = shutil.disk_usage(pfad).free / 1024**3 # Bytes in GB umrechnen
print(f"{rechner} | {benutzer} | {frei_gb:.1f} GB frei")Gestartet wird mit python info.py (unter Linux oft python3 info.py). Das f vor dem Text macht einen f-String: Ausdrücke in geschweiften Klammern werden eingesetzt, :.1f rundet auf eine Nachkommastelle.
Schritt 6: Vergleichen. Drei Sprachen, dasselbe Muster: Werte holen, in Variablen speichern, umrechnen, ausgeben. Genau dieses Muster (Eingabe, Verarbeitung, Ausgabe) zerlegst du in Lektion 2 genauer. Jetzt bist du dran: Im folgenden Code-Labor baust du die Ausgabezeile als Python-Funktion, die automatisch geprüft wird.
Code-Labor: Deine erste Statuszeile
Baue den Ausgabeteil von Leas Info-Skript als Python-Funktion. statuszeile(rechner, benutzer, frei_bytes) gibt eine Zeile zurück:
- Rechnername in Grossbuchstaben
- Benutzer unverändert
- freier Speicher in GB (1 GB = 1024³ Bytes) mit genau einer Nachkommastelle
- die drei Teile getrennt durch
|, am SchlussGB frei
Beispiel: statuszeile("srv-keller01", "lea.meier", 44560285696) ergibt "SRV-KELLER01 | lea.meier | 41.5 GB frei".
Tipp: text.upper() liefert Grossbuchstaben, in einem f-String rundet {wert:.1f} auf eine Nachkommastelle.
Typische Fehler
- Windows PowerShell 5.1 statt PowerShell 7 öffnen. Viele Beispiele funktionieren in beiden, manche nicht (z.B. neuere Parameter). Prüfe mit
$PSVersionTable.PSVersion, welche Version läuft. In VS Code wählst du unten rechts die PowerShell-Version. - Skript ohne Pfad starten.
info.ps1allein findet PowerShell nicht, auch wenn die Datei im aktuellen Ordner liegt. Richtig ist.\info.ps1bzw../info.sh. - Aliase im Skript verwenden. In PowerShell unter Linux ist
lskein Alias, sondern das echte Linux-ls, das Text liefert. Dein Skript verhält sich dann plötzlich anders. SchreibGet-ChildItem. - Die Execution Policy pauschal ausschalten.
Set-ExecutionPolicy Unrestrictedfür den ganzen Rechner ist bequem, aber unnötig.RemoteSignedfür deinen Benutzer reicht für eigene Skripte. - Leerzeichen bei Bash-Zuweisungen.
frei = 18versucht, einen Befehl namensfreiauszuführen. In Bash steht kein Leerzeichen um das Gleichheitszeichen:frei=18.
Zusammenfassung
- Ein Skript ist eine Textdatei mit Befehlen, die ein Interpreter ausführt. Es lohnt sich überall, wo dieselbe Arbeit regelmässig von Hand gemacht wird.
- PowerShell 7 ist das Werkzeug für Windows und Microsoft-Umgebungen, Bash für Linux-Server, Python für Datenaufgaben und Schnittstellen.
- Cmdlets folgen dem Muster Verb-Nomen, z.B.
Get-ChildItem. In Skripten schreibst du volle Namen statt Aliase. - PowerShell schickt Objekte durch die Pipeline, Bash Text. Mit Objekten greifst du auf Eigenschaften zu, Text musst du zerlegen.
- Skripte startest du mit Pfad:
.\skript.ps1,./skript.sh(nachchmod +x) oderpython skript.py. - Jedes Skript folgt dem Muster: Werte holen, verarbeiten, ausgeben.
Mit deiner eigenen KI vertiefen
Kopiere einen Prompt in Claude, ChatGPT oder Claude Code. Er macht die KI zur Lernbegleitung statt zum Lösungsautomaten.
Objekte und Text in der Pipeline verstehen Chat-KI
Wenn dir der Unterschied zwischen PowerShell- und Bash-Pipeline noch nicht klar ist. Die KI erklärt mit einer Analogie und prüft dann dein Verständnis.