PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : shell Variablen howto



Breezer
01-03-2002, 20:10
hallo Forum würde gerne ein kleines shell (bash) script erstellen das folgendes kann ,

in einer datei stehen wörter ( bsp. eins zwei drei )
diese würde ich gerne variablen zuordnen im Shellscript

so etwa :
zaehler_1=eins
zaehler_2= zwei .....


der haken ist nun ich weiß nicht wieviele Wörter in der Datei stehen
also müsste man das irgendwie viell. über einen counter realisieren
der die zeilen $# auf 0 testet oder so ?? und auch variablen im script anlegt
viell. über ne for Schleife
for (i=?;i--;i!=0)

do zaehler_[i]=i

done

hab suse 7.3 wenns wichtig ist?

bin auch done , thx 4 Hinweise

Breezer
03-03-2002, 12:23
Hat keiner eine Idee???

melody lee
03-03-2002, 13:23
Ich geh mal davon aus, dass Du pro Zeile EIN Wort in der Datei stehen hast - dann gehts einfach , indem Du einen neuen Kanal aufmachst:

#!/bin/bash
4<datei #öffnet den neuen Kanal
cat dbank|while read zeile <&4; do #liest zeilenweise aus dem Kanal
zaehler=zaehler_$count
echo "Der Zaehler heisst jetzt $zaehler und enthaelt $zeile" #was Du mit der Variablen machst
count=$(expr $count + 1)
done
4<&- #Kanal wieder schliesssen

Breezer
06-03-2002, 11:27
leider stehen die ausgaben nicht in der Datei untereinander ist komisch den

der Befehl direkt an der Shell mit der Ausgabeumlenkung in eine Datei bewirkt das die wörter in der Datei untereinanderstehen,
Ausführung in einem shell script via echo `awk .´{print $1}´`> file.txt bewirkt dass die Variablen untereinander geschrieben werden , dass sollte nicht sein.
Wie kann man es denn hinbekommen das bei der Ausgabeumlenkung die Variablen untereinander geschrieben werden ?

thx

melody lee
06-03-2002, 16:39
>`awk .´{print $1}´`> file.txt bewirkt dass die Variablen untereinander geschrieben werden , dass >sollte nicht sein
Sollte weiklich nicht sein, weil ein ">" die Datei normalerweise überschreibt. Probier mal ">>".

Breezer
06-03-2002, 18:35
hi mel ,
ne frage noch zu deiner 1. Antwort kannst Du mir das mal mit dem deklarieren des File Descriptors erläutern?
4<datei funzt nämlich nicht so, muß da noch vorher ein exec 4<>datei davor?
dann while read zeile : was setzt man für Zeile ein?

und zaehler=zaehler_$count ist das ne Variablendeklaration? und wiso steht das $ Zeichen vor count was bewirt dies?

danke für die Erklärungen , Gruß

mightymike99
07-03-2002, 18:59
I=0
for VALUE in $(cat datei)
do
((I=$I+1))
MYVAR[$I]=$VALUE
done
echo "LAST=${MYVAR[$I]}"


Gruß
Tobias

mightymike99
07-03-2002, 22:16
Ja, ... wie kurz doch ein shell script sein kann... danke
Hab auch mal mit arrays rum getüfftelt
na ja
i=0
exec 5<datei
while true
do
aray[i]=exec read zeile <&5
aray[i]=$zeile
if [ "$zeile" = "" ]
then exit 0
fi
#echo ${aray[$i]}
echo `cat idatei > datei`
let i=i+1
done
echo ${aray[@]}

komisch sind die zwei array zeilen unter do
ohne gehts nicht warum ?
nochwas hab ein echo auskommentiert
das echo in der letzten Zeile außerhalb der schleife funktioniert nicht warum ?
in der Schleife geht's
Noch mal zu deinem script
VALUE ist eine Variable oder?
arrays brauchen nicht vorher per declare -a definiert werden?
möchtel eigentlich in das array von zwei dateien einlesen so dass die Werte schön hintereinander stehen
array [] = datei1.1 , datei2.1 , datei1.2, datei2.2
geht das in etwa so
for VALUE in $((cat datei1) &&(cat datei2))
? Gruß

>>> aray[i]=exec read zeile <&5
So direkt kannst du keine Befehle Ausgaben zuweisen da musst Du schon mit ersetzungsoperatoren arbeiten, und die Dollarzeichen vor den Variablen nicht vergesssen:
aray[$i]=$(exec read zeile <&5)

>>>VALUE ist eine Variable oder?
Ja

>>>arrays brauchen nicht vorher per declare -a definiert werden?
Nein

>>>array [] = datei1.1 , datei2.1 , datei1.2, datei2.2
>>>geht das in etwa so
>>>for VALUE in $((cat datei1) &&(cat datei2))?
Weiss nicht schau in der man-page oder bei www.linuxfibel.de/bashprog.htm nach.

>>>das echo in der letzten Zeile außerhalb der schleife funktioniert nicht warum ?
Warum steht das @ da so aleine drin rum? Meinst Du vielleicht $@ ?

Gruß
Tobias