Variablen in Bash-Loops
Zur Navigation springen
Zur Suche springen
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