Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
bash-hilfe

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Programmieren - Allgemein
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
hubert
Gast





BeitragVerfasst am: 02. März 2002 1:11   Titel: bash-hilfe

Hi,

ich hab da ein problem:
mit dem skript will ich ein angegebenes medium 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
Gast





BeitragVerfasst am: 02. März 2002 1:15   Titel: Re: bash-hilfe

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

LBS
Gast





BeitragVerfasst am: 04. März 2002 16:13   Titel: 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'

Du müßtest mal noch in der if-Abfrage (in der while-schleife, vor dem break natürlich )noch eine zuweisung machen,

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

noch fragen???

cu
 

hubert
Gast





BeitragVerfasst am: 04. März 2002 20:54   Titel: 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.
code:
cat beliebigetextdatei | while read INPUT; do
IRGENDEINEVARIABLE=hallo
done
echo $IRGENDEINEVARIABLE


--> augabe leer.

hat jemand eine idee?

danke,
hubert.
 

LBS
Gast





BeitragVerfasst am: 05. März 2002 8:17   Titel: 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
 

hubert
Gast





BeitragVerfasst am: 05. März 2002 21:29   Titel: 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.
 

LBS
Gast





BeitragVerfasst am: 06. März 2002 9:11   Titel: 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
 

hubert
Gast





BeitragVerfasst am: 06. März 2002 20:56   Titel: 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:
code:

#!/bin/bash
DINGS=halli
export DINGS
echo $$ $DINGS
cat datei | while read NAME; do
DINGS=HALLO
#export DINGS
echo $$ $DINGS
done
echo $$ $DINGS


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
Gast





BeitragVerfasst am: 07. März 2002 7:47   Titel: 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

c u
 

hubert
Gast





BeitragVerfasst am: 07. März 2002 21:28   Titel: 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.
 

Jochen
Gast





BeitragVerfasst am: 07. März 2002 21:50   Titel: 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:
code:

#!/bin/bash
DINGS=halli
export DINGS
echo $$ $DINGS
while read NAME; do
DINGS=HALLO
#export DINGS
echo $$ $DINGS
done < datei
echo $$ $DINGS


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
Gast





BeitragVerfasst am: 08. März 2002 22:21   Titel: Re: bash-hilfe

Hallo Jochen,

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

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

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Programmieren - Allgemein Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy