[SHELL] Uitlezen parameters file

Pagina: 1
Acties:

  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05-2025
Hoi allemaal,

Ik weet niet zeker of ik hier goed zit maar toch.
Ik ben bezig met een shell script dat een bestaand bestandje uitleest.
In dit bestand staat op iedere nieuwe regel een waarde zoals hieronder te zien valt.
code:
1
2
3
4
5
6
7
8
9
10
anon1
109
63
106
0.000000
0.000000
0.000000
0.382168
0.220886
0.159000


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/ksh
if[ $1 ]
RHO_IN_DIR="rho/txt/rho-"
RHO_OUT_DIR="rho/hdf/rho-"
RD_IN_DIR="rd/txt/rd-"
RD_OUT_DIR="rd/hdf/rd-"

PARAMS=
i=0

while read line
do
    PARAMS[$i]=$line
    i=`expr $i + 1`
done 

for param in ${PARAMS[@]}
do
    echo $param
done

txt2hdf -textFile $RD_IN_DIR${PARAMS[0]}.txt -hdfFile $RD_OUT_DIR${PARAMS[0]}.hdf -xSize ${PARAMS[1]} -ySize ${PARAMS[2]} -zSize ${PARAMS[3]} -origin \"${PARAMS[4]} ${PARAMS[5]} ${PARAMS[6]}\" -extent \"${PARAMS[7]} ${PARAMS[8]} ${PARAMS[9]}\"

exit 0


Als ik dan mijn script run
komt dit eruit
code:
1
2
3
4
5
6
7
8
9
10
11
/home/jcvaneijk/work/Applications/TestRayTrace/OUTPUT% run.ksh < t2hparams 
anon1
109
63
106
0.000000
0.000000
0.000000
0.382168
0.220886
0.159000


Ziet er netjes uit zal je zeggen. Maar even verderop komt dit te staan.
code:
1
2
3
4
5
6
sizes in x: 109
sizes in y: 63
sizes in z: 106
origin: (2.79506e-261 2.7765e-308 -0.433499)
extent: (2.79544e-261 2.7765e-308 -0.433499)
writing hdf-file rd/hdf/rd-anon1.hdf ...


De waardes die achter origin en extent staan moeten dus niet dit zijn. Ik snap er niet zoveel meer van. In je shell script wordt er toch geen onderscheid gemaakt tussen integer waardes / strings in een var?

Mijn besturingssysteem is FC 6
Ik hoop dat iemand enig idee heeft, want mijn ideeen zijn een beetje op.

iRacing Profiel


  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

Wat gebeurd er in je 'txt2hdf' programma?

Skill is when luck becomes a habit.


  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05-2025
eek schreef op vrijdag 11 april 2008 @ 10:46:
Wat gebeurd er in je 'txt2hdf' programma?
Das lastig uit te leggen. Maar dat doet er niet zo heel erg veel toe. Dat programma werkt al ong 10 jaar. Het enige probleem is dat als ik hem vanuit script draai hij niet werkt. Moet ik toegeven ik ben niet zo heel erg thuis in scripts C en CUDA is meer mijn ding.

als ik txt2hdf op onderstaande manier in command line aanroep werkt het gewoon
code:
1
txt2hdf -textFile bla.txt -hdfFile bla.hdf -xSize 512 -ySize 512 -zSize 106 -origin "0.0 0.0 0.0" -extent "0.315000 0.120000 0.159000"

iRacing Profiel


  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

Ik ziet dat je de quotes escaped \", is dit nodig in een ksh script?

Skill is when luck becomes a habit.


  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05-2025
eek schreef op vrijdag 11 april 2008 @ 10:56:
Ik ziet dat je de quotes escaped \", is dit nodig in een ksh script?
OMG thank you so much. Wat is het ook eigenlijk een walgelijk iets dat shell scripting :S Ene shell weer wel andere weer niet :S

Maar bedankt het werkt

iRacing Profiel


  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05-2025
Nadat het lijkt te werken, werkt het nog niet helemaal. Zoals hierboven is te zien maak ik gebruik van een while loop om mijn tekstbestand regel voor regel op te slaan in een parameter.
Dit lijkt goed te gaan, maar niet helemaal. Mijn tekstbestand heeft 10 regels, mijn PARAMS daarentegen heeft maar 9 waardes (0 tot 8)
print ik binnen de while loop $i dan zie ik idd netjes 1 2 ... 9. Wat ik niet snap is dat hij niet over alle (10) regels loopt. want blijkbaar laat hij de laatste regel van mijn bestand ongemoeid?


code:
1
2
3
4
5
6
7
8
9
while read line
do
    PARAMS[$i]=$line
    
    i=`expr $i + 1`
    echo $i
done

echo $i


code:
1
2
3
4
5
6
7
8
9
10
11
/home/jcvaneijk/work/Applications/TestRayTrace/OUTPUT% run < t2hparams
1
2
3
4
5
6
7
8
9
9

iRacing Profiel


  • TeeDee
  • Registratie: Februari 2001
  • Nu online

TeeDee

CQB 241

Draai de assignments eens om? Dus eerst i=... en vervolgens PARAMS[$i]?
let wel op de eerste assignment van i.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05-2025
Dat is leuk maar dan vult hij PARAMS[0] niet meer. Dit is eigenlijk het verplaatsen van het probleem.
Eerste waarde is verdwenen laatste waarde is er nu wel.

iRacing Profiel


  • whoami
  • Registratie: December 2000
  • Laatst online: 30-01 23:30
Dergelijke OS specifieke scripts horen thuis in het gerelateerde OS forum; in dit geval dus NOS

PRG > NOS

https://fgheysels.github.io/


  • TeeDee
  • Registratie: Februari 2001
  • Nu online

TeeDee

CQB 241

En als je eerst i=0 buiten je loop assigned. Vervolgens in je loop verder met i=i+1?

Heart..pumps blood.Has nothing to do with emotion! Bored


  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05-2025
Ok, tnx

iRacing Profiel


  • Aetje
  • Registratie: September 2001
  • Laatst online: 18-12-2025

Aetje

Troubleshooting met HAMERRR

jvaneijk schreef op maandag 14 april 2008 @ 10:35:
Nadat het lijkt te werken, werkt het nog niet helemaal. Zoals hierboven is te zien maak ik gebruik van een while loop om mijn tekstbestand regel voor regel op te slaan in een parameter.
Dit lijkt goed te gaan, maar niet helemaal. Mijn tekstbestand heeft 10 regels, mijn PARAMS daarentegen heeft maar 9 waardes (0 tot 8)
print ik binnen de while loop $i dan zie ik idd netjes 1 2 ... 9. Wat ik niet snap is dat hij niet over alle (10) regels loopt. want blijkbaar laat hij de laatste regel van mijn bestand ongemoeid?


code:
1
2
3
4
5
6
7
8
9
while read line
do
    PARAMS[$i]=$line
    
    i=`expr $i + 1`
    echo $i
done

echo $i
Herschrijf:
code:
1
2
3
4
5
6
7
8
while read line
do
    PARAMS[$i]=$line
    echo $i 
    i=`expr $i + 1`
done

echo $i

En als je i met een startwaarde van 1 will laten beginnen, gewoon lekker i=1; voor de loop gooien. Je probleem is iig dat je de echo na het ophogen van de waarde doet, waardoor de eerste waarde niet geechoet wordt, en de laatste dubbel. Ophogen binnen een while loop is nagenoeg altijd het laatste statement in de loop.

[ Voor 21% gewijzigd door Aetje op 14-04-2008 11:02 ]

Forget your fears...
...and want to know more...


  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05-2025
TeeDee schreef op maandag 14 april 2008 @ 10:56:
En als je eerst i=0 buiten je loop assigned. Vervolgens in je loop verder met i=i+1?
Dat heb ik al.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/ksh
PARAMS=
i=0

while read line
do
    PARAMS[$i]=$line
    
    i=`expr $i + 1`
    echo $i
done

echo $i

iRacing Profiel


  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05-2025
Aetje schreef op maandag 14 april 2008 @ 10:57:
[...]


Herschrijf:
code:
1
2
3
4
5
6
7
8
while read line
do
    PARAMS[$i]=$line
    echo $i 
    i=`expr $i + 1`
done

echo $i
Het gaat mij er niet om dat hij 1 t/m 10 goed op het scherm schrijft maar dat hij mijn array goed vult binnen mijn while loop

iRacing Profiel


  • Aetje
  • Registratie: September 2001
  • Laatst online: 18-12-2025

Aetje

Troubleshooting met HAMERRR

Je array werd waarschijnlijk al goed gevuld. Je probleem is dat je de waarde van "i" echoet na het ophogen, waardoor de waarde waarmee je binnen de loop bezig bent (die je dus wil weten) met 1 verhoogd is. Overigens denk ik dat je liever een echo "PARAMS[$i]" wil doen om dat te checken.

Forget your fears...
...and want to know more...


  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05-2025
Aetje schreef op maandag 14 april 2008 @ 11:04:
Je array werd waarschijnlijk al goed gevuld. Je probleem is dat je de waarde van "i" echoet na het ophogen, waardoor de waarde waarmee je binnen de loop bezig bent (die je dus wil weten) met 1 verhoogd is. Overigens denk ik dat je liever een echo "PARAMS[$i]" wil doen om dat te checken.
Mijn array wordt niet goed gevuld. Als je iets verder omhoog had gegaan had je dat kunnen zien. Dat was mijn eerste probleem. Ik heb alleen gekeken hoe mijn $i loopt. En die loopt dus van 0-8 terwijl ik 10 regels/zinnen/lijnen in mijn bestand heb.

Als ik "echo ${PARAMS[9]}" doe komt er niets uit.

iRacing Profiel


  • Aetje
  • Registratie: September 2001
  • Laatst online: 18-12-2025

Aetje

Troubleshooting met HAMERRR

En de PARAMS[8] is dat je laatste of voorlaatste regel uit het textbestand?

Forget your fears...
...and want to know more...


  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05-2025
Aetje schreef op maandag 14 april 2008 @ 11:10:
En de PARAMS[8] is dat je laatste of voorlaatste regel uit het textbestand?
voorlaatste regel in mijn bestand

iRacing Profiel


  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05-2025
Ik heb zelf het idee dat ik iets substantieel over het hoofd zie bij het gebruik van die while loop

iRacing Profiel


  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05-2025
Ik heb een hele slechte (niet nette) oplossing gevonden. de C-applicatie die het bestand aanmaakt schrijft gewoon een extra \n weg naar het bestand. Wat dus resulteert in eigenlijk 11 regels maar het werkt nu wel.

iRacing Profiel


  • Aetje
  • Registratie: September 2001
  • Laatst online: 18-12-2025

Aetje

Troubleshooting met HAMERRR

Het probleem waar jij mee zit is in feite de implementatie van "read line". Deze zal falen als er geen nieuwe regel is. Dus de laatste regel die je leest vult denk ik nog wel de parameter $line, maar zal je uit de while loop trappen voordat de $line geprocessed wordt. Nettere oplossing in that case:
code:
1
2
3
4
5
6
7
8
while read line
do
    PARAMS[$i]=$line
    echo $i    
    i=`expr $i + 1`
done
PARAMS[$i]=$line
echo $i

Forget your fears...
...and want to know more...


  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05-2025
Aetje schreef op maandag 14 april 2008 @ 11:51:
Het probleem waar jij mee zit is in feite de implementatie van "read line". Deze zal falen als er geen nieuwe regel is. Dus de laatste regel die je leest vult denk ik nog wel de parameter $line, maar zal je uit de while loop trappen voordat de $line geprocessed wordt. Nettere oplossing in that case:
code:
1
2
3
4
5
6
7
8
while read line
do
    PARAMS[$i]=$line
    echo $i    
    i=`expr $i + 1`
done
PARAMS[$i]=$line
echo $i
Thanks, dit werkt idd ook heel goed. En is nog netter ook. Leest nu alle waardes uit de file zonder enige problemen, ook al blijft het vreemd.

iRacing Profiel


  • VyperX
  • Registratie: Juni 2001
  • Laatst online: 06-01 08:45
Ik vermoed dat het komt doordat read line een newline aan het einde van de regel verwacht. Oftewel, een extra newline toevoegen aan het einde van je configuratie bestandje.

My Dwarf Fortress ASCII Reward: ~~@~~####,.".D",.B""


  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05-2025
VyperX schreef op maandag 14 april 2008 @ 12:50:
Ik vermoed dat het komt doordat read line een newline aan het einde van de regel verwacht. Oftewel, een extra newline toevoegen aan het einde van je configuratie bestandje.
Dit is niet het geval. Aetje zijn oplossing werkt ook. Ik zat zelf namelijk ook aan de newline te denken. Deze oplossing werkt wel maar is natuurlijk niet echt een oplossing maar meer manier om je probleem te ontlopen.

iRacing Profiel

Pagina: 1