[erledigt] Bash: read und HERE-Dokument

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
k2
Beiträge: 132
Registriert: 14.08.2002 22:29:28
Lizenz eigener Beiträge: MIT Lizenz

[erledigt] Bash: read und HERE-Dokument

Beitrag von k2 » 18.04.2016 18:09:32

Hallo - ich schon wieder...

ich wollte eine ausgewählte Zeile von Werten aus einem HERE-Dokument auf eine Variablenreihe mittels read einlesen (nachdem Schmerzen mit zweidimensionalen Arrays mich dazu nötigen...). Das funktioniert, solange die Auswahl gefunden wird. Wenn die Auswahl nicht gefunden wird, werden die zuletzt eingelesen Werte aus der Variablenreihe offensichtlich wieder gelöscht. ??? Weiß jemand warum und wie man das umgehen kann? Ich hätte die letzte Variablenreihe gerne als default-Werte übernommen, falls keine Auswahl zutrifft.

Code: Alles auswählen

#!/bin/bash
auswahl="gibts nicht"

while read var v1 v2 v3 v4 v5
do
  echo "Durchlauf: " $var $v1 $v2 $v3 $v4 $v5
  if [[ "$auswahl" == "$var" ]]  
  then
     echo "Auswahl gefunden: $var"
     break
  fi
done <<EOF
buchstaben a b c d e
zahlen 1 2 3 4 5
hunde hund1 hund2 hund3 hund4 hund5
default wert1 wert2 wert3 wert4 wert5
EOF
echo "Variablenbelegung: " $var $v1 $v2 $v3 $v4 $v5
Sonst bleibt mir nur noch ein break wenn $var="default"

Vielen dank vorab
Zuletzt geändert von k2 am 19.04.2016 10:42:10, insgesamt 1-mal geändert.

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Bash: read und HERE-Dokument

Beitrag von rendegast » 18.04.2016 23:31:56

Ziemlich "zu Fuß":

Code: Alles auswählen

#!/bin/bash
auswahl="gibts nicht"

tempf=$(tempfile)

while read var v1 v2 v3 v4 v5
do
  echo "Durchlauf: " $var $v1 $v2 $v3 $v4 $v5
  echo "var=$var; v1=$v1; v2=$v2; v3=$v3; v3=$v4; v4=$v5;" > $tempf
  if [[ "$auswahl" == "$var" ]] 
  then
     echo "Auswahl gefunden: $var"
     break
  fi
done <<EOF
buchstaben a b c d e
zahlen 1 2 3 4 5
hunde hund1 hund2 hund3 hund4 hund5
default wert1 wert2 wert3 wert4 wert5
EOF

. $tempf
echo "Variablenbelegung: " $var $v1 $v2 $v3 $v4 $v5

rm $tempf
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

k2
Beiträge: 132
Registriert: 14.08.2002 22:29:28
Lizenz eigener Beiträge: MIT Lizenz

Re: Bash: read und HERE-Dokument

Beitrag von k2 » 19.04.2016 10:41:26

Danke Dir!
Ich habe noch eine Abfrage zum Ausstieg aus der Schleife beim letzten Durchlauf eingefügt. Funktioniert. Aber den Grund für das vorherige Nicht-Funktionieren kenne ich noch nicht. read wird bei Pipes in einer Subshell ausgeführt aber nicht bei Verwendung eines HERE-Strings - und damit wohl auch nicht bei HERE-Dokumenten.

Code: Alles auswählen

#!/bin/bash
auswahl="gibts nicht"

while read var v1 v2 v3 v4 v5
do
  echo "Durchlauf: " $var $v1 $v2 $v3 $v4 $v5
  if [[ "$var" == "$auswahl" ]] || [[ "$var" == "default" ]]
  then
     echo "Auswahl: $var"
     break
  fi
done <<EOF
buchstaben a b c d e
zahlen 1 2 3 4 5
hunde hund1 hund2 hund3 hund4 hund5
default wert1 wert2 wert3 wert4 wert5
EOF
echo "Variablenbelegung: " $var $v1 $v2 $v3 $v4 $v5

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: [erledigt] Bash: read und HERE-Dokument

Beitrag von rendegast » 19.04.2016 12:09:10

Aber den Grund für das vorherige Nicht-Funktionieren kenne ich noch nicht. read wird bei Pipes in einer Subshell ausgeführt aber nicht bei Verwendung eines HERE-Strings - und damit wohl auch nicht bei HERE-Dokumenten.
Ich dachte da eher an das 'break',
daß dabei das Environment der Subshell wohl in die Shell übernommen wird.

Wenn ich in der subshell eine Variable definiere,
so wird sie immer in die main-Shell übernommen:

Code: Alles auswählen

while read var v1 v2 v3 v4 v5
do
tempv=AAAAA$var
  echo "Durchlauf: " $var $v1 $v2 $v3 $v4 $v5 $tempv
  #if [[ "$var" == "$auswahl" ]] || [[ "$var" == "default" ]]
  if [[ "$var" == "$auswahl" ]]
  then
...
EOF
echo "Variablenbelegung: " $var $v1 $v2 $v3 $v4 $v5 $tempv
Es erfolgt immer auch die Ausgabe von tempv,
auch im Falle des letzten Durchlaufs "default ....".
Also das tempv "default" (AAAAdefault) wird auch in der Main-Shell ausgegeben,
nicht jedoch var=default.

Code: Alles auswählen

$ ./script
Durchlauf:  buchstaben a b c d e AAAAAbuchstaben
Durchlauf:  zahlen 1 2 3 4 5 AAAAAzahlen
Durchlauf:  hunde hund1 hund2 hund3 hund4 hund5 AAAAAhunde
Durchlauf:  default wert1 wert2 wert3 wert4 wert5 AAAAAdefault
Variablenbelegung:  AAAAAdefault
Es scheint so, daß die durch 'read' gesetzten Variablen anderer Art sind als die
das "normal" definierte tempv.
Dieser Unterschied wird aber durch das 'break' aufgehoben.
Eventuell ein feature, daß das Environment der subshell (oder Teile davon, namentlich die gerade gültigen read-Variablen) in die main-Shell zur Fehlerauswertung resp. Weiterverarbeitung dienen können?

Das hätte dann auch einen Sicherheitsaspekt.
Ein Profi könnte/wird die main-Shell über die subshell angreifen.





Allgemein Sicherheit,
falls die Variablen nicht bearbeitet werden sollen,
sollten die Quotes beim 'echo' die Variablen mit einschließen.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Antworten