Benutzer-Werkzeuge

Webseiten-Werkzeuge


de:technik:gnu_und_linux:shellscripting:schleifen

Inhaltsverzeichnis

IndexDeutschTechnikGNU und LinuxShell ScriptingSchleifen

Schleifen

Einleitung

In Shell gibt es mehrere Arten von Schleifen. Die while und die for und die foreach-Schleife. Die man-Pages dazu kann man mit man n while, man n for und man n foreach öffnen.

while wiederholt solange, bis der Schleifenkopf 0 zurück gibt. Im Gegensatz dazu Iteriert for über eine durch Leerzeichen getrennte Liste an Elementen.

WHILE

ls | while read -r x; do echo "- $x"; done
  • Listet alle Elemente eines Ordners auf
  • while read wird benutzt um Zeilenweise den Output von ls zu lesen und nicht nach Leerzeichen zu trennen
  • Bei read sollte man -r nutzen, damit Backslashes (\) richtig eingelesen werden
y=0
ls | while read -r x; do
  y=10
done
echo $y
  • Gibt 0 aus
  • Durch die Pipe wird eine Subshell gestartet und Variablenänderungen haben keine Auswirkungen nach außen
y=0
ls | while read -r x; do
  y=$(( y + 1 ))
  echo $y
done
echo $y
  • Gibt als letztes 0 aus
  • Durch die Pipe wird eine Subshell gestartet und Variablenänderungen haben keine Auswirkungen nach außen
  • In der Subshell wird die Variable trotzdem hoch gezählt (0 1 2 3 4 …)
y=0
while read -r x; do
  y=$(( y + 1 ))
  echo $y
done < <(ls)
echo $y
  • So wird die Schleife nicht in einer Subshell ausgeführt und die Änderung der Variable hat Auswirkungen nach Außerhalb

FOR

for x in *; do echo "- $x"; done
  • RICHTIG
  • Listet alle Elemente eines Ordners auf
  • Hierbei würde über jedes Element im Ordner iteriert.
for x in $(ls); do echo "- $x"; done
  • FALSCH
  • Listet alle Elemente eines Ordners auf (aber falsch)
  • Hier würde die for-Schleife nach Leerzeichen trennen und somit Dateinamen mit Leerzeichen trennen.
  • Die for x in $(…) Syntax sollte in diesem Fall nicht genutzt werden.
for x in $(factor 8); do echo $x; done
  • Iteriere über die Wörter eines Befehls, getrennt nach Leerzeichen
for file in *.mp3; do echo "mp3 file: $file"; done
  • Mache etwas für alle .mp3 Dateien Dateien im Ordner
for file in $(seq 0 10 100); do echo $file; done
  • Zählt 0 10 20 30… bis 100
for file in {0..100..10}; do echo $file; done
  • Zählt 0 10 20 30… bis 100
  • Kurzform für seq 0 10 100

xargs

de/technik/gnu_und_linux/shellscripting/schleifen.txt · Zuletzt geändert: 2018/12/30 14:39 von GeloMyrtol