[linux-l] Bash-Frage

Lutz Meinert lutz.meinert at madvedge.de
Di Okt 15 01:46:49 CEST 2002


Am Mon, 2002-10-14 um 11.09 schrieb Steffen Dettmer:

> > Gute Idee. Ich verwende allerdings lieber eine Funktion, die ich auf
> > beliebige Textmeldungen anwenden kann:
> > 
> > function GF_MsgBox
> > {
> >   dialog --title "CORP" --msgbox \
> >   "$(eval echo \"$(cat $gvMsgDir/$1)\")" 25 80
> > }
> 
> brauchst Du zwei neue Shellprozesse, nur um einen einfachen Text
> zu bauen, der für den dritten ist. Natürlich ist die Leistung
> hier da, klar, danach wird ja eh auf den Benutzer gewartet, aber
> ich finde es nicht sonderlich "schick" Leistung so zu verheizen.
> Hab auch mal ein so aufgebautes Script, was ein bißchen gewachsen
> ist, und inzwischen kotzig langsam ist (60 mal langsamer ist ja
> egal, wenn es insgesammt 1 Sekunde dauert, die man wartet. Wenn
> es aber 60 sind, und man es auch in einer schaffen würde, ist's
> ärgerlich :)).
> 
> > > LOGGED_AS_MSG='Sie sind als _LOGNAME_ angemedelt';
> > > dialog  --msgbox "${LOGGED_AS_MSG//_LOGNAME_/$LOGNAME}"
> > > 
> > > Nicht mehr lesbar, aber schnell (hier wird _LOGNAME_ als token
> 
> Wenn das mit einem Kommentar in Deiner Funktion steht, ist's ja
> wieder akzeptabel, BTW. Du kannst ja auch:
> "${LOGGED_AS_MSG//\$LOGNAME/$LOGNAME}"
> 
> machen, dann wird $LOGNAME so ersetzt, wie es auch eval machen
> würde - nur eben schnell und ohne Platte klappern.

Hallo Steffen,

Dein Einwand ist überzeugend, ich weiß nur nicht so genau, wie ich solch
ein Konstrukt in eine Funktion packen kann, die sich auf alle
Textmeldungen anwenden lässt, egal ob und wie viele Variablen sich darin
tummeln.

Folgendes Beispiel soll dies verdeutlichen:

Das ist mein Text-file nonRoot:
\n
Sorry, Sie sind nicht als "root", sondern als "LOGNAME" angemeldet. \n
\n
Bitte starten Sie das Programm noch einmal als "root".
\n

Das ist der Aufruf im Script, wobei das Textfile in eine Variable
eingelesen wird. Der entsprechenden Funktion GF_MsgBoxVar wird der zu
ersetzende Name als Argument übergeben:
lvGetTxt=$(cat $gvMsgDir/nonRoot)
# check root permissions
if [ $UID = 0 ]
    then GF_MsgBoxTxt welcome
    else GF_MsgBoxVar LOGNAME
	 exit 0
fi

Die Funktion GF_MsgBoxVar dazu:
function GF_MsgBoxVar ()
{
dialog --title "CORP" --msgbox \
"${lvGetTxt//$1/$LOGNAME}" 25 80
}

Das klappt,allerdings nur, weil der zu ersetzende Ausdruck bereits drin
steht. Erst richtig brauchbar wäre es, wenn ich der Funktion sagen
könnte: "Ersetze Argument durch Argument mit einem $-Zeichen davor und
werte aus."

Ich habe folgendes probiert:
"${lvGetTxt//$1/\$$1}"

klappt nicht, weil $LOGNAME in diesem FAll nicht ausgewertet wird. 

Auch bei der Frage, wie bei mehreren Argumenten (wenn der Text mehrere
Variablen enthält, bsw.: "Die Partition $Partition wurde erfolgreich mit
$FS formatiert.") zu verfahren, tappe ich im Dunklen.

Mit einem naiven "${lvGetTxt//$@/neu$@}" zur Probe bin ich gescheitert.

Gibt es dafür eine Lösung oder bleibt mir dann doch nur die schnarchige
eval-Variante übrig, die wenigstens alle Variablen bedient?

Übrigens Dir vielen Dank wie auch allen anderen, die mir auf meine
andere Frage betreffs meines Dialog-Rätsels geantwortet haben. Ich bin
noch nicht dazu gekommen, die Erkenntnisse in die Praxis umzusetzen,
werde es aber als bald tun. 

Jetzt gehe ich aber erst einmal schlafen,

Gute Nacht
Lutz







Mehr Informationen über die Mailingliste linux-l