Shellskript: Sichtbarkeit von Variablen außerhalb Schleife

Liebe Leute,

bin grad am Verzweifeln: ich initialisiere in meinem Shellskript eine Variable (außerhalb einer Schleife) mit 0. Anschließend zähle ich sie in einer while--do--done Schleife hoch. Nach der Schleife, also außerhalb, hätte ich gern den Wert zur Weiterverwendung. Aber da ist der Wert nicht mehr sichtbar, sonder das Ding hat nach der Schleife wieder den Initialisierungswert, also 0.

Dass das hochzählen innerhalb der Schleife geklappt hat, ist sicher, denn innerhalb der Schleife hab ich mir nachm Hochzählen den Wert immer ausgeben lassen, und da hat's gepasst. Also hat die Variable am Ende der Schleife ihren neuen Wert "vergessen".

Wie kann das sein?

*am eigenen Verstand zweifel*

MfG und danke schonmal!

henning-malaysia
 
Hi.

Poste mal den Code anstatt nur eine dürftige Beschreibung zu liefern (warum brechen sich die Leute immer einen ab um etwas zu beschreiben was besser/vollständig/klarer mit dem Code zu sagen ist um den es geht?!)

Wahrscheinlich liegt es daran, das die Schleife in einer Subshell ausgeführt wird, aber genau kann man das erst sagen wenn der Code konkret vorliegt.

Und sag auch gleich noch welche Shell du überhaupt benutzt.

Gruß
 
OK OK, hast ja recht...:) Hier der Code:




function countlines()
{
counter=0

cat tmpfile.tmp |
while read linevar
do
counter=`expr $counter + 1`
echo $counter // HIER HAT ER IMMER DEN RICHTIGEN WERT, ALSO EINS MEHR
done

echo $counter // HIER HAT ER WIEDER DEN ALTEN WERT, ALSO 0
}


Die Funktion liegt in einem ShellSkript, ich benutze die bash.

MfG

Henning
 
Wie bereits vermutet wird die Schleife in einer sogenannten Subshell ausgeführt. Das geschieht automatisch da die Schleife in einer Pipe steht. Die Variablen werden zwar von oben in die Subshell übernommen, können aber nicht zurückgegeben werden.

Das Skript kannst du z.B. so ändern:
Bash:
function countlines()
{
  local -i counter=0

  while read line; do 
    let ++counter
  done < tmpfile.tmp
  echo $counter
}

Gruß
 
Zurück