BASH - Variablen verwinden bei zu großer Struktur

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
K.I.T.T.
Beiträge: 104
Registriert: 14.11.2005 11:33:38

BASH - Variablen verwinden bei zu großer Struktur

Beitrag von K.I.T.T. » 13.03.2006 17:59:01

Hallo

bei mir Verschwinden die Variablen zum Bespiel bei sowas

Code: Alles auswählen

ls | while read line
do
    var=2
done
echo $var
In manch anderen Fall hat schon export $var geholfen.
Doch wenn jetzt noch ein paar if's und weitere schleifen und pipes hinzukommen verschwindet die $var im nirvana.

Kann man dem irgendwie permanent machen. Auch mit mehreren Variablen.
Ohne dabei in eine Datei schreiben zu müssen. (Das ist momentan die einzigste Möglichkeit) :-(
Gibt es evtl. sowas wie ein Global in der BASH?

Gruß & thxs

Benutzeravatar
peschmae
Beiträge: 4844
Registriert: 07.01.2003 12:50:33
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: nirgendwo im irgendwo

Beitrag von peschmae » 13.03.2006 18:11:14

Das Problem ist, dass wenn du Pipes verwendest für die while-Schleife ein separater Kindprozess erstellt wird.

Da Variablen die du im Kindprozess änderst im Parent-Prozess nicht geändert werden gehen entsprechende Variablen verloren.

Umgehen kannst du das z.B. indem du statt "ls | while read line" sowas machst wie "for f in $(ls); do"
eventuell vorher noch

Code: Alles auswählen

IFS="
"
setzen oder so.

MfG Peschmä
"er hätte nicht in die usa ziehen dürfen - die versauen alles" -- Snoopy

K.I.T.T.
Beiträge: 104
Registriert: 14.11.2005 11:33:38

Beitrag von K.I.T.T. » 14.03.2006 11:24:35

peschmae hat geschrieben:Das Problem ist, dass wenn du Pipes verwendest für die while-Schleife ein separater Kindprozess erstellt wird.

Da Variablen die du im Kindprozess änderst im Parent-Prozess nicht geändert werden gehen entsprechende Variablen verloren.

Umgehen kannst du das z.B. indem du statt "ls | while read line" sowas machst wie "for f in $(ls); do"
eventuell vorher noch

Code: Alles auswählen

IFS="
"
setzen oder so.
Danke. Dieser Fall funktioniert.

Aber in einer Mehrzeiligen Dialogabfrage

Code: Alles auswählen

#!/bin/bash

: ${DIALOG=dialog}
exec 3>&1
value=`$DIALOG --ok-label "Submit" \
  --backtitle "$backtitle" \
    --form "Test" \
    20 50 0 \
    "Wert1:"         1 1     "$wert1"        1 25 10 10 \
    "Wert2:"         2 1     "$wert2"        2 25 10 10 \
    "Wert3:"         3 1     "$wert2"        3 25 10 10 \
    2>&1 1>&3`

IFS="
"

col=0
for val in `echo $value`
do
    col=$(expr $col + 1)
    case $col in
        1)  wert1="$val" ;;
        2)  wert2="$val" ;;
        3)  wert3="$val" ;;
    esac
done
echo "1: $wert1"
echo "2: $wert2"
echo "3: $wert3"

col=0
echo "$value" | while read line
do
    col=$(expr $col + 1)
    echo "Wert$col - $line"
done
mit dieser Eingabe

Code: Alles auswählen

              │ │Wert1:                  Value1              │ │
              │ │Wert2:                  Val2 TEST           │ │
              │ │Wert3:                  Test                │ │
ergibt sowas fehlerhaftes :-(

Code: Alles auswählen

1: Value1  Val2 TEST Test
2:
3:
Wert1 - Value1
Wert2 - Val2 TEST
Wert3 - Test
Die While Methode kommt damit ohne Probleme klar. Doch IF, trotz einiger Versuche mit dem IFS-Parameter, scheitert jedesmal :-(

Man kann doch mit While auch so arbeiten:

Code: Alles auswählen

while read line
do
	echo $line
done < datei
So gibt es vermutlich keine Pipe.

Kann man "< datei" irgendwie auch mit einer Variable füllen ?

Wie bereits erwähnt, ich möchte auf keinen Fall Dateien schreiben müssen.
Die BASH dafür doch irgendwas haben, nur die Manual ist einfach zu groß um da wirklich mal was zu finden :-(

Gruß

Antworten