BASH: ini file auslesen, kommentare auslassen
- killerhippy
- Posts: 529
- Joined: 19. May 2000 19:36
- Contact:
BASH: ini file auslesen, kommentare auslassen
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?
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
Killerhippy
Re: BASH: ini file auslesen, kommentare auslassen
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
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
source somefile.rc
</font><hr></pre></blockquote>
mfg rg
Re: BASH: ini file auslesen, kommentare auslassen
oops. nee, war natürlich mist. ich geh jetzt besser schlafen.
Re: BASH: ini file auslesen, kommentare auslassen
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.
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.
- killerhippy
- Posts: 529
- Joined: 19. May 2000 19:36
- Contact:
Re: BASH: ini file auslesen, kommentare auslassen
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">
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
Killerhippy
Re: BASH: ini file auslesen, kommentare auslassen
> 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).
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).
Re: BASH: ini file auslesen, kommentare auslassen
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.
<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.
Re: BASH: ini file auslesen, kommentare auslassen
@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
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
- killerhippy
- Posts: 529
- Joined: 19. May 2000 19:36
- Contact:
Re: BASH: ini file auslesen, kommentare auslassen
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...
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
Killerhippy
Re: BASH: ini file auslesen, kommentare auslassen
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
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
- killerhippy
- Posts: 529
- Joined: 19. May 2000 19:36
- Contact:
Re: BASH: ini file auslesen, kommentare auslassen
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...
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.