Variablen in Bash-Loops

Aus Knowledgebase
Wechseln zu: Navigation, Suche

Bei der Programmierung von Loops in Bash-Scripten muß darauf geachtet werden, daß eine while-Loop eine Subshell startet. Variablen, die dort definiert werden, sind in der ursprünglichen Shell nicht mehr verfügbar. Eine for-Loop vermeidet das.

Ebenso springt eine exit-Anweisung in einer while-Loop nicht aus dem ganzen Shellscript raus, sondern nur aus der Loop (Subshell wird beendet).

Beispiel

#!/bin/bash

echo > /tmp/foo

echo piped while loop

 foo=0
 echo "foo == $foo"

 cat /tmp/foo | while read line; do
   foo=1
   echo "foo == $foo"
 done

 echo "foo == $foo"

echo redirected while loop

 foo=0
 echo "foo == $foo"

 while read line; do
   foo=1
   echo "foo == $foo"
 done < /tmp/foo

 echo "foo == $foo"

Bash startet für die erste While-Schleife eine Subshell, so dass foo für die äußere Shell nie auf den Wert 1 gesetzt wird. Bei der zweiten klappt es allerdings -- denn dort wird für die Redirection (done < /tmp/foo) keine Subshell gestartet.

$ bash bash-while-loops 
piped while loop
foo == 0
foo == 1
foo == 0
redirected while loop
foo == 0
foo == 1
foo == 1

Weblinks