bash-hilfe
bash-hilfe
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.
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.
Re: bash-hilfe
sorry, mein text ist mies formatiert, werd mir beim nächsten mal vorher die ultra-board-tags anschauen.
hubert.
hubert.
Re: bash-hilfe
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
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
Re: bash-hilfe
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.
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.
Re: bash-hilfe
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
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
Re: bash-hilfe
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.
> 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.
Re: bash-hilfe
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
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
Re: bash-hilfe
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.
> 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.
Re: bash-hilfe
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
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
Re: bash-hilfe
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.
> 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.
Re: bash-hilfe
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
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
Re: bash-hilfe
Hallo Jochen,
> while read NAME; do
> ......
> ......
> done < datei
wow, es funktioniert!
vielen dank fuer die Hilfe.
Hubert.
> while read NAME; do
> ......
> ......
> done < datei
wow, es funktioniert!
vielen dank fuer die Hilfe.
Hubert.