Modulseite

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.

ca. 35 Min.0/3 Checks gelöst

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 7BashPython 3
ZuhauseWindows, Microsoft 365, Active DirectoryLinux-Server, Container, Netzwerkgeräteüberall, Daten und Schnittstellen
Datei-Endung.ps1.sh.py
Was durch die Pipeline fliesstObjekteText(keine Shell-Pipeline, eigene Datenstrukturen)
Typischer AuftragBenutzer anlegen, Server prüfenLogfiles auswerten, Backups per cronCSV und JSON verarbeiten, Web-APIs abfragen
Skript starten.\info.ps1./info.shpython 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.

AktionPowerShellBash
Wo bin ich?Get-Locationpwd
Ordner wechselnSet-Location C:\Skriptecd ~/skripte
Inhalt anzeigenGet-ChildItemls -l
Ordner anlegenNew-Item -ItemType Directory -Path Testmkdir test
Datei kopierenCopy-Item a.txt b.txtcp a.txt b.txt
Datei verschiebenMove-Item a.txt Archiv\mv a.txt archiv/
Datei löschenRemove-Item a.txtrm a.txt
Datei anzeigenGet-Content log.txtcat log.txt
Text suchenSelect-String -Pattern Fehler -Path log.txtgrep Fehler log.txt
HilfeGet-Help Copy-Item -Examplesman 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.

Check 1 · ZuordnenEinstieg

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:

PowerShell
Get-ChildItem -Path C:\Temp -File |
    Sort-Object -Property Length -Descending |
    Select-Object -Property Name, Length -First 3

Sort-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:

Bash
ls -l /tmp | sort -k5 -n -r | head -n 3

sort -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.

Check 2 · Eine AntwortFortgeschritten

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:

PowerShell
# 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:

Text
PC-LEA01 | lea.meier | 112.4 GB frei

Kommt 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:

Bash
#!/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:

Bash
chmod +x info.sh
./info.sh
Text
web01 | lea | 18G frei

Achte 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:

Python
# 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.

Check 3 · Code-LaborEinstieg

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 Schluss GB 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.

Code-Labor · Python
Strg + Enter

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.ps1 allein findet PowerShell nicht, auch wenn die Datei im aktuellen Ordner liegt. Richtig ist .\info.ps1 bzw. ./info.sh.
  • Aliase im Skript verwenden. In PowerShell unter Linux ist ls kein Alias, sondern das echte Linux-ls, das Text liefert. Dein Skript verhält sich dann plötzlich anders. Schreib Get-ChildItem.
  • Die Execution Policy pauschal ausschalten. Set-ExecutionPolicy Unrestricted für den ganzen Rechner ist bequem, aber unnötig. RemoteSigned für deinen Benutzer reicht für eigene Skripte.
  • Leerzeichen bei Bash-Zuweisungen. frei = 18 versucht, einen Befehl namens frei auszufü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 (nach chmod +x) oder python 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.