BASH: ini file auslesen, kommentare auslassen

Post Reply
Message
Author
User avatar
killerhippy
Posts: 529
Joined: 19. May 2000 19:36
Contact:

BASH: ini file auslesen, kommentare auslassen

#1 Post by killerhippy »

Hi coders und andere,

ich habe ein <i>somefile.ini</i>, das folgende Struktur hat:

---schnipp---
####### comment frame start

# comment
KEYWORD=VALUE

...

####### comment frame end

...
---schnapp---

und ein bash-script, das die KEYWORD=VALUEs auslesen und verwerten soll. Bisher bin ich zu folgendem code gekommen:

<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
for I in `awk '{ print $1 }' somefile.ini`; do
HAVE_COMMENT=`echo $I | grep "^#"`
if [ ! $HAVE_COMMENT ]; then
export $I
fi
done
</font><hr></pre></blockquote>

...was aber elendig langsam ist. In perl hätte ich sowas wie ~/^#/ gefragt, aber das ist in bash-scripten wohl nicht direkt möglich.

Wie macht man das eleganter und vor allem schneller, das ein ini-file geparst wird, wobei Kommentare beginnend mit # nicht beachtet werden?
Es gibt keine dumme Fragen!

Killerhippy

rattengift

Re: BASH: ini file auslesen, kommentare auslassen

#2 Post by rattengift »

hi, am einfachsten und schnellsten geht das wohl mit
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
source somefile.rc
</font><hr></pre></blockquote>
mfg rg

rattengift

Re: BASH: ini file auslesen, kommentare auslassen

#3 Post by rattengift »

oops. nee, war natürlich mist. ich geh jetzt besser schlafen.

rattengift

Re: BASH: ini file auslesen, kommentare auslassen

#4 Post by rattengift »

bin nun doch noch da.
richtig, du wolltest ja nicht nur zuweisen sondern auch exportieren.
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">#!/bin/bash

while read I IGNORE; do
[ "${I#\#}" = "$I" ] && [ "$I" != "" ] && export $I
done < somefile.rc</font><hr></pre></blockquote>ich hoffe, das geht nun. PS: der erste vergleich prüft auf kommentar, der zweite filtert leerzeilen aus.

User avatar
killerhippy
Posts: 529
Joined: 19. May 2000 19:36
Contact:

Re: BASH: ini file auslesen, kommentare auslassen

#5 Post by killerhippy »

Hi rattengift,

vielen Dank, das fluppt ja wie gewienert <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

...und schon wieder eine Konstruktion kennengelernt, auf die ich nicht von alleine gekommen wäre <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">
Es gibt keine dumme Fragen!

Killerhippy

rattengift

Re: BASH: ini file auslesen, kommentare auslassen

#6 Post by rattengift »

> vielen Dank, das fluppt ja wie gewienert

schön, dass es klappt.
deine version war langsam, weil für jede zeile sowohl awk als auch grep aufgerufen werden mussten. (in meiner version nur bash-builtins).

> ...und schon wieder eine Konstruktion kennengelernt, auf die ich nicht von alleine gekommen wäre

ääh, allein wär ich da ja wohl auch nicht draufgekommen....
den trick mit dem "while .... done < file" hab ich auch hier im forum mal aufgeschnappt.
die sache mit der parametersubstitution (#\#) kannst du im kofler nachlesen. es gibt natürlich noch viel mehr möglichkeiten (wie immer bei linux).

rattengift

Re: BASH: ini file auslesen, kommentare auslassen

#7 Post by rattengift »

hier ist noch eine andere variante, die nochmal einfacher ist. sie ist deiner ursprünglichen version ähnlich (aber grep wird hier nur 2x gerufen):
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">for I in $(grep -v "^\W*\#" somefile.rc | grep -v "^$"); do
export $I
done</font><hr></pre></blockquote>
1.grep: kommentarzeilen raus, 2.grep: leerzeilen raus. (das 2.grep bräuchte man nicht, da "for" leerzeilen auch ignoriert, aber mir ist es lieber, wenn das gleich von grep erledigt wird).

mir ist noch eingefallen, dass es am elegantesten/schnellsten wohl mit xargs gehen müsste. bin aber grad auf arbeit u kanns nicht ausprobieren.

Jochen

Re: BASH: ini file auslesen, kommentare auslassen

#8 Post by Jochen »

@rattengift: Kein xargs! export ist Shell-Builtin, daher werden die Variablen alle für die ausführende Shell gesetzt. Wenn Du xargs verwendest, wird für die Ausführung der von xargs zusammengestoppelten Prozesse eine Subshell gestartet. Diese bekommt dann jede Menge Umgebungsvariablne gesetzt, aber nicht die eigentliche Shell, die sie bekommen soll!

Rückfrage: Ist das export denn wirklich nötig? Ansonsten würde ". <i>somefile.ini</i>" (wie rattengift als allererstes gepostet hat) ja vollkommen ausreichen. Mir schien es, als wäre das ein Überbleibsel von killerhippies ersten Näherung an sein Problem?

Jochen

User avatar
killerhippy
Posts: 529
Joined: 19. May 2000 19:36
Contact:

Re: BASH: ini file auslesen, kommentare auslassen

#9 Post by killerhippy »

Hi Jochen,

ob das export wirklich nötig ist? Hm, wie du dir ja sicher denken kannst, geht es nur darum, dem script die Variablen und deren Zuweisungen aus dem ini File zugänglich zu machen.

Wenn ich also z. B. in $I den Inhalt "MYVAR=/dies/und/das" (ohne Anführungszeichen) habe, habe ich es bisher nicht gebacken gekriegt, die für das script neue Variable MYVAR mit "/dies/und/das" zu belegen, außer mit export. Nach Beendigung des scripts, sind die exportieren Variablen ja wieder weg, damit bin ich so schon zufrieden...

@rattengift: Die Lösung mit der while Schleife gefällt mir bisher am Besten, da ich da ohne eine weitere Subshell mit grep auskomme.

@beide: Eine andere Lösung ohne export und weiteren Subshells würde mich schon interessieren...
Es gibt keine dumme Fragen!

Killerhippy

Jochen

Re: BASH: ini file auslesen, kommentare auslassen

#10 Post by Jochen »

Sag ich ja! <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

Du hast es nicht gebacken bekommen, weil Du Dich unnötigerweise in die while-Schleife verbissen hast. Probier mal folgendes:

<li>Datei namens "variablen" mit Inhalt
<pre>VAR1=hempel ; VAR2=egal # Auch mit Kommentar!</pre>
<li>Datei namens "skript"
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">#!/bin/sh
. variablen
echo $VAR1
echo $VAR2</font><hr></pre></blockquote>Wetten, Du erhältst "hempel" und "egal" ausgegeben, wenn Du "./skript" aufrufst? Und ganz ohne export...

Alternativ kannst auch mal folgendes ausprobieren:<pre>ZEILE="VAR=irgendwas" ; eval "$ZEILE" ; echo $VAR</pre>Geht auch ohne export...

Es ist eher eine Sache des Prinzips, zugegebenermassen. Aber es könnten ja andere Programme die exportierten Variablen sehen und versuchen zu interpretieren. Wenn man die Variablen nicht exportiert, sind sie nur für die Shell interessant.

Jochen

User avatar
killerhippy
Posts: 529
Joined: 19. May 2000 19:36
Contact:

Re: BASH: ini file auslesen, kommentare auslassen

#11 Post by killerhippy »

Hi Jochen,

wenn man nur weiß, wonach man suchen muß, ist man bash ja recht informativ <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
# fetching variables from the ini-file

source ./file.ini || { echo -e "\<!--no-->nmovie_db.ini ist korrupt!" &&
echo -e "\<!--no-->nInitialisierung fehlgeschlagen!\<!--no-->n" &&
exit 1; }

</font><hr></pre></blockquote>

ist nun die (wahrscheinlich) endgültige Form. Wäre ja auch zu doof, wenn es keine built-in Funktion diesbezüglich gegeben hätte...
Last edited by killerhippy on 29. Apr 2003 13:17, edited 1 time in total.

Post Reply