Får inte till läsning till variabler från fil…

Här diskuterar vi skal, kommandon och klassiska linuxverktyg.
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Får inte till läsning till variabler från fil…

Inlägg av Johnny Rosenberg »

Jag har i ett skript skapat en fil med några variablers innehåll. Nu vill jag med ett annat skript hämta värdena från filen och läsa in dem i några variabler.

Har fårstått hur jag kan göra liknande grejer i vanliga loopar, men mina variabler heter ju helt olika saker. Kanske enklast om jag hittar på ett exempel i och för sig:

Vi säger att jag har några variabler enligt följande:

Kod: Markera allt

Name="Johnny Rosenberg"
ShoeSize="44"
FavColour="Röd"
FavCar="Citroën C6"
Bones="206"
Dessa variabler skriver jag till en fil, låt oss kalla den ”data”. Den kommer i detta exempel att se ut så här:

Kod: Markera allt

Johnny Rosenberg
44
Röd
Citroën C6
206
Jag vill nu i ett annat skript läsa in variablerna från filen igen. Fipplade och experimenterade en del, men fick det inte att fungera som jag ville. Läste mig till några varianter av hur man läser filer radvis, men lösningarna jag hittade var inte så tillämpbara här, såvida man inte trixar på mer eller mindre långsökta vis. Exempelvis kan jag säkert läsa in dem i en loop till variabler med namn som slutar på en siffra som ökas för varje varv i loopen, men det känns som att det borde finnas något smidigare sätt…

Vill alltså att (i detta påhittade exempel) variabeln ”Name” ska bli tilldelad innehållet i filens första rad, ShoeSize ska bli filens andra rad och så vidare.
Helst vill jag inte blanda in ytterligare program såsom ”sed” eller ”awk”, men måste man så måste man och då får jag väl acceptera det…
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: Får inte till läsning till variabler från fil…

Inlägg av Osprey »

Ska du bara läsa in data för en person/enhet, eller kan det förekomma flera i datafilen..?
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Får inte till läsning till variabler från fil…

Inlägg av Konservburk »

Det absolut enklaste är att låta variabelfilen se ut som i ditt första kodexempel. Då kan du sedan läsa in variablerna genom att helt enkelt köra: source variabelfilen
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Får inte till läsning till variabler från fil…

Inlägg av Johnny Rosenberg »

Osprey skrev:Ska du bara läsa in data för en person/enhet, eller kan det förekomma flera i datafilen..?
Mitt exempel var nog lite olyckligt. Tänkte inte på det. Nej, det är mer av typen ”blandade variabler”. Jag drog bara till med något i just detta exemplet. I mitt riktiga exempel är det mest sökvägar i filen men inte enbart.
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Får inte till läsning till variabler från fil…

Inlägg av Johnny Rosenberg »

Konservburk skrev:Det absolut enklaste är att låta variabelfilen se ut som i ditt första kodexempel. Då kan du sedan läsa in variablerna genom att helt enkelt köra: source variabelfilen
Jo, den tanken har slagit mig också, när det gäller just det jag försöker göra för tillfället.
Dock är jag nyfiken av naturen, tror jag, så även om jag löser det på ett helt annat sätt, så vill jag ändå veta hur jag skulle kunnat lösa det i just detta fallet.

Jag har ju förstått att man, i många andra fall kan ha en konstruktion av följande typ:

Kod: Markera allt

while condition
do
   some code
   more stuff
   read LineFromFile
   something different
done < FileName
Men om jag exempelvis gör följande, kommer första raden att läsas varje gång:

Kod: Markera allt

read a < FileName
read tjoho < FileName
read jippie < FileName
En idé är om man kan använda indexerade variabler, vilket jag inte vet om och hur man kan göra i shell-skript, men i någon sorts påhittad pseudokod skulle det kunna se ut så här:

Kod: Markera allt

for i=1 to 7; do
   read Text[i]
done < FileName

Name="$Text[1]"
ShoeSize="$Text[2]"
…
…
…
Men det känns lite onödigt att spara samma saker på två olika ställen.

En fråga bara, när du nämner det där med att helt enkelt köra datafilen med ”source data”, efter modifiering: Måste filens första rad fortfarande vara ”#!/bin/sh”?
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Får inte till läsning till variabler från fil…

Inlägg av Konservburk »

Johnny Rosenberg skrev:Jag har ju förstått att man, i många andra fall kan ha en konstruktion av följande typ:

Kod: Markera allt

while condition
do
   some code
   more stuff
   read LineFromFile
   something different
done < FileName
Men om jag exempelvis gör följande, kommer första raden att läsas varje gång:

Kod: Markera allt

read a < FileName
read tjoho < FileName
read jippie < FileName
Man brukar ha själva read-kommandot som villkor och på så sätt helt enkelt läsa rad för rad tills filen tar slut:

Kod: Markera allt

while read i
do echo "[$i]"
done < FileName
Anledningen till att du hela tiden får första raden när du kör read löst är att du återöppnar filen FileName varje gång. Om du isället öppnar den en gång och låter den vara öppen tills du är klar med read så blir det som du vill:

Kod: Markera allt

#Öppna filen FileName för läsning
exec 3<&1 <FileName

read a
read tjoho
read jippie

#Stäng filen FileName
exec <&3 3<&-
Det går även göra så här:

Kod: Markera allt

{
read a
read tjoho
read jippie
} < FileName
Johnny Rosenberg skrev:En fråga bara, när du nämner det där med att helt enkelt köra datafilen med ”source data”, efter modifiering: Måste filens första rad fortfarande vara ”#!/bin/sh”?
Du behöver inte ha med #!/bin/sh när du inkluderar kod med source eftersom det ändå bara räknas som en kommentar i det fallet.
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Får inte till läsning till variabler från fil…

Inlägg av Johnny Rosenberg »

Konservburk skrev:Om du istället öppnar den en gång och låter den vara öppen tills du är klar med read så blir det som du vill:

Kod: Markera allt

#Öppna filen FileName för läsning
exec 3<&1 <FileName

read a
read tjoho
read jippie

#Stäng filen FileName
exec <&3 3<&-
Okej, det fungerar säkert, men erkänn att det där ser allt annat än lättläst ut… ;D

Tänkte framför allt på exec-raderna då, förstås.
Konservburk skrev:Det går även göra så här:

Kod: Markera allt

{
read a
read tjoho
read jippie
} < FileName
Där satt den, tror jag. Lättläst och funktionellt. Påminner om mitt misslyckade försök med do och done, med den avgörande skillnaden att detta fungerar. Min tanke var nämligen att man kanske kunde använda do och done UTAN exempelvis while, men det gick ju inte. Lösningen med { och } verkar ju lovande i alla fall.

Tackar ödmjukast.
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Skriv svar

Återgå till "Terminalforum"