bash-hilfe

Post Reply
Message
Author
hubert

bash-hilfe

#1 Post by hubert »

Hi,

ich hab da ein problem:
mit dem skript will ich ein angegebenes medium <u>mounten. die medien sind in einer datei aufgelistet.

mountdatei:

floppy a /media/floppy
CD-ROM c /media/cdrom ejectable
ZIP-Drive z /media/zip ejectable
(etc...)
---------------------------------------------------
(also:
display-name abk. mount-point ejectable?)

diese function durchsucht fuer ein gegebenes medium (zb "z") die obige datei:
function scan ()
{
MDEV=$1 # device, das gemounted werden soll (zb "z")
found=false

cat mountdatei | while read DISPLAYNAME DEVICE MOUNTPOINT EJECTABLE; do
if [ "$MDEV" = "$DEVICE" ]; then
found=true
break
fi
done

if [ "$found" = "true" ]; then
echo mounting $DISPLAYNAME
mount $MOUNTPOINT && cd $MOUNTPOINT
fi

die while-schleife funktioniert soweit, dass sie bei gefundenem medium abbricht, aber die im loop gesetzte variablen ($found, $MOUNTPOINT, etc) sind nach beenden des loops nicht gesetzt. was passiert hier genau? wird durch das pipe eine zweite shell eröffnet? (wenn ich mit "echo $$" die prozessnummer ausgebe, erhalte ich innerhalb und ausserhalb des loop die gleiche prozess-nr).

wenn ich den mount/cd-block in den ersten then-block setze, wird zwar das richtige medium gemounted, aber der cd-befehl bleibt ohne wirkung (ich rufe das skript "gesourced" auf).
ok, es ist nur ein unwichtiges kleines skript, aber mich würde interessieren, was ich hier falsch mache. und was genau bewirkt "cat mountdatei | while read ...."?

wäre super, wenn mir jemand weiterhelfen könnte,
Hubert.

hubert

Re: bash-hilfe

#2 Post by hubert »

sorry, mein text ist mies formatiert, werd mir beim nächsten mal vorher die ultra-board-tags anschauen.
hubert.

LBS

Re: bash-hilfe

#3 Post by LBS »

Servo,

also der cat...|while macht folgendes:
cat übergibt zeilenweise der while schleife, die läuft so lange bis cat ans ende gelangt und nichts mehr übergibt.
read nimmt die übergebene zeile auf und übergibt der reihenfolge nach die wörter in seine "Variablen" --> man 'read' <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

Du müßtest mal noch in der if-Abfrage (in der while-schleife, vor dem break natürlich <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle"> )noch eine zuweisung machen,

z.B.
display=$DISPLAYNAME
devic=$DEVICE
usw.

noch fragen???

cu

hubert

Re: bash-hilfe

#4 Post by hubert »

Hallo LBS,

danke fuer die Hilfe, habs ausprobiert, aber es bringt nichts.
das problem ist, dass einfach alle variablenzuweisungen, die ich innerhalb der schleife vornehme, nach schleifenende wieder unbekannt sind.
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">cat beliebigetextdatei | while read INPUT; do
IRGENDEINEVARIABLE=hallo
done
echo $IRGENDEINEVARIABLE </font><hr></pre></blockquote>
--> augabe leer.

hat jemand eine idee?

danke,
hubert.

LBS

Re: bash-hilfe

#5 Post by LBS »

Hm...
jetzt interessiert es mich selber. Also ich hab hier bei mir nur die ksh aber da funzt es ohne probleme. Reagiert da die bash anders???
probiers mal mit nem export variablenname innerhalb der schleife, damit müßte dann der Name in jeder shell bekannt sein.

cu

hubert

Re: bash-hilfe

#6 Post by hubert »

Hallo LBS,

> probiers mal mit nem export variablenname innerhalb der schleife, damit müßte dann der Name in jeder shell bekannt sein.

hab ich auch probiert, geht auch nicht. vielleicht sollte ich besser perl benutzen, da hat man solche probleme nicht und ist zudem nicht an eine bestimmte shell gebunden.

Hubert.

LBS

Re: bash-hilfe

#7 Post by LBS »

Tach nochmal,

bis jetzt sind wir ja immer davon ausgegangen, das irgendwann mal in die if Anweisung gesprungen wird, was aber wenn nicht??? Hast Du schon mal eine Variable probehalber außerhalb dem if definiert??? Probier mal ein echo $Variablenname auserhalb des if`s und natürlich innerhalb der Schleife. Kannst ja auch mal nen 'read xy' innerhalb der if-Anweisung setzen, dann siehst Du ob er wirklich die Anweisung auch verarbeitet

so long

LBS

hubert

Re: bash-hilfe

#8 Post by hubert »

Hallo LBS,

> bis jetzt sind wir ja immer davon ausgegangen, das irgendwann mal in die if Anweisung gesprungen wird, was aber wenn nicht???

es wurde schon ausgeführt, ich hatte zusätzliche echos eingebaut.

> Hast Du schon mal eine Variable probehalber außerhalb dem if definiert???

ich hab das problem jetzt mal aufs wesentliche reduziert und alle deine vorschläge eingebaut. resultat:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#!/bin/bash
DINGS=halli
export DINGS
echo $$ $DINGS
cat datei | while read NAME; do
DINGS=HALLO
#export DINGS
echo $$ $DINGS
done
echo $$ $DINGS
</font><hr></pre></blockquote>
Ausgabe:
6448 halli
6448 HALLO
6448 HALLO
6448 HALLO
[...]
6448 HALLO
6448 halli

komisch, nicht? also, ich mach das jetzt wohl besser doch in perl....

danke fuer die hilfe,
Hubert.

LBS

Re: bash-hilfe

#9 Post by LBS »

Tach,

bei mir klappte es wie gesagt anstandslos

code:
#! /usr/bin/ksh
DINGS=halli
echo $$ $DINGS
read xy
for x in `awk '{ print $1 }' datei`; do
DINGS=HALLO
echo $$ $DINGS
read xy
done
echo "letztes $$ $DINGS"

Du kannst es ja mal ohne PIPE und mit einer einfachen for schleife probiern

Ansonsten ist Perl auch eine sehr schöne Sprache und wesentlich schneller als so ne alte Muschel <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

c u

hubert

Re: bash-hilfe

#10 Post by hubert »

Hallo LBS,

> for x in `awk '{ print $1 }' datei`; do

> bei mir klappte es wie gesagt anstandslos

aber du hast ja auch gar nicht cat..| verwendet sondern awk.
vielleicht sollte ich mich doch mal mit awk befassen, werde obige variante jedenfalls mal ausprobieren.

danke,
Hubert.

Jochen

Re: bash-hilfe

#11 Post by Jochen »

Hubert,

am Unterschied awk/cat kann es m.E nicht liegen. Schon eher liegt es am Unterschied, wie die Schleife formuliert wird. Mit Deinem "cat ... | while ... " veranlasst Du die Shell, für die while-Schleife eine Subshell aufzumachen. Dass sich diese über $$ nicht zu erkennen gibt, dürfte schlicht daran liegen, dass diese Parametersubstitution noch von der ausführenden Shell gemacht wird, bevor die Subshell gestartet wird. Bei der for-Schleife wird nur ein Prozess für den awk gestartet, dessen Output dann zur Argumentliste für die for-Schleife wird, welche von der ausführenden Shell abgearbeitet wird - also keine Probleme mit Variablen-Setzen.

Und daher meine ich, dass Du Dein Problem beheben kannst, wenn Du auf das (überflüssige) cat verzichtest und einfach eine Eingabeumlekung für die while-Schleife machst:<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#!/bin/bash
DINGS=halli
export DINGS
echo $$ $DINGS
while read NAME; do
DINGS=HALLO
#export DINGS
echo $$ $DINGS
done <b>< datei</b>
echo $$ $DINGS
</font><hr></pre></blockquote>
Die Dateieingabeumlenkung steckt da, wo man sie bei einfachen Kommandos auch erwartet: Am Ende, also hinter dem done, dass die Schleife abschliesst. Ergebnis: Bei einer Datei "datei" mit 3 Zeilen Inhalt ergibt sich

5083 halli
5083 HALLO
5083 HALLO
5083 HALLO
5083 HALLO

Man beachte die letzte Zeile! Viel Spass noch, ob nun in der Shell oder in perl.

Jochen

hubert

Re: bash-hilfe

#12 Post by hubert »

Hallo Jochen,

> while read NAME; do
> ......
> ......
> done < datei

wow, es funktioniert!
vielen dank fuer die Hilfe.
Hubert.

Post Reply